Path: blob/21.2-virgl/src/freedreno/isa/ir3-cat6.xml
4564 views
<?xml version="1.0" encoding="UTF-8"?>1<!--2Copyright © 2020 Google, Inc.34Permission is hereby granted, free of charge, to any person obtaining a5copy of this software and associated documentation files (the "Software"),6to deal in the Software without restriction, including without limitation7the rights to use, copy, modify, merge, publish, distribute, sublicense,8and/or sell copies of the Software, and to permit persons to whom the9Software is furnished to do so, subject to the following conditions:1011The above copyright notice and this permission notice (including the next12paragraph) shall be included in all copies or substantial portions of the13Software.1415THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL18THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER19LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,20OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21SOFTWARE.22-->2324<isa>2526<!--27Cat6 Instructions: load/store/atomic instructions28-->2930<bitset name="#instruction-cat6" extends="#instruction">31<field pos="59" name="JP" type="bool" display="(jp)"/>32<field pos="60" name="SY" type="bool" display="(sy)"/>33<pattern low="61" high="63">110</pattern> <!-- cat6 -->34<encode>35<map name="TYPE">src->cat6.type</map>36</encode>37</bitset>3839<bitset name="#instruction-cat6-a3xx" extends="#instruction-cat6">40<field name="TYPE" low="49" high="51" type="#type"/>41<!-- TODO pull more fields up to this level, when they are common across sub-encodings -->42</bitset>4344<bitset name="#instruction-cat6-ldg" extends="#instruction-cat6-a3xx">45<pattern pos="0" >1</pattern>46<field low="14" high="21" name="SRC1" type="#reg-gpr"/>47<pattern pos="23" >1</pattern>48<field low="24" high="31" name="SIZE" type="uint"/>49<field low="32" high="39" name="DST" type="#reg-gpr"/>50<pattern low="40" high="48">xxxxxxxxx</pattern>51<pattern low="52" high="53">00</pattern>52<pattern low="54" high="58">00000</pattern> <!-- OPC -->53</bitset>5455<bitset name="ldg" extends="#instruction-cat6-ldg">56<doc>57LoaD Global58</doc>5960<display>61{SY}{JP}{NAME}.{TYPE} {DST}, g[{SRC1}{OFF}], {SIZE}62</display>6364<field low="1" high="13" name="OFF" type="offset"/>65<pattern pos="22" >0</pattern> <!-- Imm offset ldg form -->6667<encode>68<map name="OFF">src->srcs[1]->iim_val</map>69<map name="SIZE">src->srcs[2]->uim_val</map>70</encode>71</bitset>7273<bitset name="ldg.a" extends="#instruction-cat6-ldg">74<doc>75LoaD Global76</doc>7778<gen min="600"/>7980<display>81{SY}{JP}{NAME}.{TYPE} {DST}, g[{SRC1}+({SRC2}{OFF})<<{SRC2_BYTE_SHIFT}], {SIZE}82</display>8384<override>85<display>86{SY}{JP}{NAME}.{TYPE} {DST}, g[{SRC1}+{SRC2}<<{SRC2_BYTE_SHIFT}{OFF}<<2], {SIZE}87</display>88<expr>{SRC2_ADD_DWORD_SHIFT} > 0</expr>89</override>9091<field low="1" high="8" name="SRC2" type="#reg-gpr"/>92<field low="9" high="10" name="OFF" type="uoffset"/>93<assert pos="11" >0</assert>94<field low="12" high="13" name="SRC2_ADD_DWORD_SHIFT" type="uint"/>95<pattern pos="22" >1</pattern> <!-- Reg offset ldg form -->9697<derived name="SRC2_BYTE_SHIFT" width="3" type="uint">98<expr>{SRC2_ADD_DWORD_SHIFT} + 2</expr>99</derived>100101<encode>102<map name="SRC2">src->srcs[1]</map>103<map name="SRC2_ADD_DWORD_SHIFT">src->srcs[2]->uim_val</map>104<map name="OFF">src->srcs[3]->uim_val</map>105<map name="SIZE">src->srcs[4]->uim_val</map>106</encode>107</bitset>108109<bitset name="#instruction-cat6-stg" extends="#instruction-cat6-a3xx">110<pattern pos="0" >x</pattern>111<field low="1" high="8" name="SRC3" type="#reg-gpr"/>112<pattern low="14" high="21">xxxxxxxx</pattern>113<pattern low="22" high="23">1x</pattern>114<field low="24" high="31" name="SIZE" type="uint"/>115<field pos="40" name="DST_OFF" type="bool"/>116<field low="41" high="48" name="SRC1" type="#reg-gpr"/>117<pattern pos="53" >x</pattern>118<pattern low="54" high="58">00011</pattern> <!-- OPC -->119120<encode>121<map name="DST_OFF" force="true">1</map>122</encode>123</bitset>124125<bitset name="stg" extends="#instruction-cat6-stg">126<doc>127STore Global128</doc>129130<display>131{SY}{JP}{NAME}.{TYPE} g[{SRC1}{OFF}], {SRC3}, {SIZE}132</display>133134<derived name="OFF" width="13" type="offset">135<expr>({OFF_HI} << 8) | {OFF_LO}</expr>136</derived>137138<field low="9" high="13" name="OFF_HI" type="uint"/>139<field low="32" high="39" name="OFF_LO" type="uint"/>140<pattern pos="52" >0</pattern> <!-- Imm offset stg form -->141142<encode>143<map name="OFF_LO">src->srcs[1]->iim_val</map>144<map name="OFF_HI">src->srcs[1]->iim_val >> 8</map>145<map name="SRC3">src->srcs[2]</map>146<map name="SIZE">src->srcs[3]->uim_val</map>147</encode>148</bitset>149150<bitset name="stg.a" extends="#instruction-cat6-stg">151<doc>152STore Global153</doc>154155<gen min="600"/>156157<display>158{SY}{JP}{NAME}.{TYPE} g[{SRC1}+({SRC2}{OFF})<<{DST_BYTE_SHIFT}], {SRC3}, {SIZE}159</display>160161<override>162<display>163{SY}{JP}{NAME}.{TYPE} g[{SRC1}+{SRC2}<<{DST_BYTE_SHIFT}{OFF}<<2], {SRC3}, {SIZE}164</display>165<expr>{SRC2_ADD_DWORD_SHIFT} > 0</expr>166</override>167168<derived name="DST_BYTE_SHIFT" width="3" type="uint">169<expr>{SRC2_ADD_DWORD_SHIFT} + 2</expr>170</derived>171172<field low="9" high="10" name="OFF" type="uoffset"/>173<assert pos="11" >0</assert>174<field low="12" high="13" name="SRC2_ADD_DWORD_SHIFT" type="uint"/>175<field low="32" high="39" name="SRC2" type="#reg-gpr"/>176<pattern pos="52" >1</pattern> <!-- Reg offset stg form -->177178<encode>179<map name="SRC2">src->srcs[1]</map>180<map name="SRC2_ADD_DWORD_SHIFT">src->srcs[2]->uim_val</map>181<map name="OFF">src->srcs[3]->uim_val</map>182<map name="SRC3">src->srcs[4]</map>183<map name="SIZE">src->srcs[5]->uim_val</map>184</encode>185</bitset>186187<bitset name="#instruction-cat6-a3xx-ld" extends="#instruction-cat6-a3xx">188<pattern pos="0" >1</pattern>189<field low="1" high="13" name="OFF" type="offset"/>190<field low="14" high="21" name="SRC" type="#reg-gpr"/>191<pattern pos="22" >x</pattern>192<pattern pos="23" >1</pattern>193<field low="24" high="31" name="SIZE" type="uint"/>194<field low="32" high="39" name="DST" type="#reg-gpr"/>195<pattern low="40" high="48">xxxxxxxxx</pattern>196<pattern low="52" high="53">xx</pattern>197<encode>198<map name="OFF">src->srcs[1]->uim_val</map>199<map name="SRC">src->srcs[0]</map>200<map name="SIZE">src->srcs[2]->uim_val</map>201</encode>202</bitset>203204<bitset name="ldl" extends="#instruction-cat6-a3xx-ld">205<doc>206LoaD Local207</doc>208<display>209{SY}{JP}{NAME}.{TYPE} {DST}, l[{SRC}{OFF}], {SIZE}210</display>211<pattern low="54" high="58">00001</pattern> <!-- OPC -->212</bitset>213214<bitset name="ldp" extends="#instruction-cat6-a3xx-ld">215<doc>216LoaD Private217</doc>218<display>219{SY}{JP}{NAME}.{TYPE} {DST}, p[{SRC}{OFF}], {SIZE}220</display>221<pattern low="54" high="58">00010</pattern> <!-- OPC -->222</bitset>223224<bitset name="ldlw" extends="#instruction-cat6-a3xx-ld">225<doc>226LoaD Local (variant used for passing data between geom stages)227</doc>228<display>229{SY}{JP}{NAME}.{TYPE} {DST}, l[{SRC}{OFF}], {SIZE}230</display>231<pattern low="54" high="58">01010</pattern> <!-- OPC -->232</bitset>233234<bitset name="ldlv" extends="#instruction-cat6-a3xx">235<doc>236LoaD Local Varying - read directly from varying storage237</doc>238<display>239{SY}{JP}{NAME}.{TYPE} {DST}, l[{OFF}], {SIZE}240</display>241<pattern pos="0" >0</pattern>242<field low="1" high="13" name="OFF" type="uint"/>243<pattern low="14" high="21">xxxxxxxx</pattern> <!-- SRC -->244<pattern low="22" high="23">11</pattern>245<field low="24" high="31" name="SIZE" type="uint"/>246<field low="32" high="39" name="DST" type="#reg-gpr"/>247<pattern low="40" high="48">xxxxxxxxx</pattern>248<pattern low="52" high="53">xx</pattern>249<pattern low="54" high="58">11111</pattern> <!-- OPC -->250<encode>251<map name="SIZE">src->srcs[1]->uim_val</map>252<map name="OFF">src->srcs[0]->uim_val</map>253</encode>254</bitset>255256<bitset name="#instruction-cat6-a3xx-st" extends="#instruction-cat6-a3xx">257<derived name="OFF" width="13" type="offset">258<expr>({OFF_HI} << 8) | {OFF_LO}</expr>259</derived>260261<field low="1" high="8" name="SRC" type="#reg-gpr"/>262<field low="9" high="13" name="OFF_HI" type="uint"/>263<pattern low="14" high="22">xxxxxxxxx</pattern>264<pattern pos="23" >1</pattern>265<field low="24" high="31" name="SIZE" type="uint"/>266<field low="32" high="39" name="OFF_LO" type="uint"/>267<pattern pos="40" >1</pattern>268<field low="41" high="48" name="DST" type="#reg-gpr"/>269<pattern low="52" high="53">xx</pattern>270<encode>271<!--272TODO get rid of dst_offset and use a normal (potentially273immed) reg.. for now match the existing ir3 until we can274drop the old packed-struct encoding275-->276<map name="OFF_HI">src->cat6.dst_offset >> 8</map>277<map name="OFF_LO">src->cat6.dst_offset & 0xff</map>278<map name="SRC">src->srcs[1]</map>279<map name="DST">src->srcs[0]</map>"280<map name="SIZE">src->srcs[2]->uim_val</map>281</encode>282</bitset>283284<bitset name="stl" extends="#instruction-cat6-a3xx-st">285<doc>286STore Local287</doc>288<display>289{SY}{JP}{NAME}.{TYPE} l[{DST}{OFF}], {SRC}, {SIZE}290</display>291<pattern pos="0" >x</pattern>292<pattern low="54" high="58">00100</pattern> <!-- OPC -->293</bitset>294295<bitset name="stp" extends="#instruction-cat6-a3xx-st">296<doc>297STore Private298</doc>299<display>300{SY}{JP}{NAME}.{TYPE} p[{DST}{OFF}], {SRC}, {SIZE}301</display>302<pattern pos="0" >0</pattern> <!-- SRC_OFF -->303<pattern low="54" high="58">00101</pattern> <!-- OPC -->304</bitset>305306<bitset name="stlw" extends="#instruction-cat6-a3xx-st">307<doc>308STore Local (variant used for passing data between geom stages)309</doc>310<display>311{SY}{JP}{NAME}.{TYPE} l[{DST}{OFF}], {SRC}, {SIZE}312</display>313<pattern pos="0" >x</pattern>314<pattern low="54" high="58">01011</pattern> <!-- OPC -->315</bitset>316317<bitset name="stc" extends="#instruction-cat6-a3xx">318<doc>319STore Const - used for shader prolog (between shps and shpe)320to store "uniform folded" values into CONST file321322NOTE: TYPE field actually seems to be set to different323values (ie f32 vs u32), but I *think* it does not matter.324(There is SP_MODE_CONTROL.CONSTANT_DEMOTION_ENABLE, but325I think float results are already converted to 32b)326327NOTE: this could be the "old" encoding, although it328would conflict with stgb from earlier gens329</doc>330<display>331{SY}{JP}{NAME} c[{DST}], {SRC}, {SIZE}332</display>333<gen min="600"/>334<pattern pos="0" >x</pattern>335<field low="1" high="8" name="SRC" type="#reg-gpr"/>336<pattern low="9" high="22">xxxxxxxxxxxxxx</pattern>337<pattern pos="23" >1</pattern>338<field low="24" high="26" name="SIZE" type="uint"/>339<pattern low="27" high="31">xxxxx</pattern>340<field low="32" high="39" name="DST" type="uint"/>341<pattern low="40" high="48">xxxxxxxxx</pattern>342<pattern low="52" high="53">xx</pattern>343<pattern low="54" high="58">11100</pattern> <!-- OPC -->344<encode>345<map name="DST">src->srcs[0]->uim_val</map>346<map name="SRC">src->srcs[1]</map>347</encode>348</bitset>349350<bitset name="resinfo" extends="#instruction-cat6-a3xx">351<display>352{SY}{JP}{NAME}.{TYPE}.{D}d {DST}, g[{SSBO}]353</display>354<derived name="D" expr="#cat6-d" type="uint"/>355356<pattern pos="0" >x</pattern>357<pattern low="1" high="8" >xxxxxxxx</pattern> <!-- SRC3 -->358<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>359<pattern pos="11" >x</pattern> <!-- TYPED -->360<pattern low="12" high="13">xx</pattern> <!-- TYPE_SIZE -->361<pattern low="14" high="21">xxxxxxxx</pattern> <!-- SRC1 -->362<pattern pos="22" >x</pattern> <!-- SRC1_IM -->363<pattern pos="23" >x</pattern> <!-- SRC2_IM -->364<pattern low="24" high="31">xxxxxxxx</pattern> <!-- SRC2 -->365<field low="32" high="39" name="DST" type="#reg-gpr"/>366<pattern pos="40" >0</pattern>367<field low="41" high="48" name="SSBO" type="#cat6-src"> <!-- SSBO/image binding point -->368<param name="SSBO_IM" as="SRC_IM"/>369</field>370<pattern pos="52" >x</pattern> <!-- G -->371<field pos="53" name="SSBO_IM" type="bool"/>372<pattern low="54" high="58">01111</pattern> <!-- OPC -->373<encode>374<map name="D_MINUS_ONE">src->cat6.d - 1</map>375<map name="SSBO">src->srcs[0]</map>376<map name="SSBO_IM">!!(src->srcs[0]->flags & IR3_REG_IMMED)</map>377</encode>378</bitset>379380<!-- ldgb.untyped.4d.f32.4 r0.x, g[0], r0.x, r1.z -->381<bitset name="ldgb" extends="#instruction-cat6-a3xx">382<display>383{SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE} {DST}, g[{SSBO}], {SRC1}, {SRC2}384</display>385<gen max="599"/>386387<derived name="D" expr="#cat6-d" type="uint"/>388<derived name="TYPE_SIZE" expr="#cat6-type-size" type="uint"/>389390<pattern pos="0" >x</pattern>391<pattern low="1" high="8" >xxxxxxxx</pattern> <!-- SRC3 -->392<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>393<field pos="11" name="TYPED" type="#cat6-typed"/>394<field low="12" high="13" name="TYPE_SIZE_MINUS_ONE" type="uint"/>395<field low="14" high="21" name="SRC1" type="#cat6-src">396<param name="SRC1_IM" as="SRC_IM"/>397</field>398<field pos="22" name="SRC1_IM" type="bool"/>399<field pos="23" name="SRC2_IM" type="bool"/>400<field low="24" high="31" name="SRC2" type="#cat6-src">401<param name="SRC2_IM" as="SRC_IM"/>402</field>403<field low="32" high="39" name="DST" type="#reg-gpr"/>404<pattern pos="40" >0</pattern>405<field low="41" high="48" name="SSBO" type="#cat6-src"> <!-- SSBO/image binding point -->406<param name="SSBO_IM" as="SRC_IM"/>407</field>408<pattern pos="52" >x</pattern> <!-- G -->409<field pos="53" name="SSBO_IM" type="bool"/>410<pattern low="54" high="58">11011</pattern> <!-- OPC -->411<encode>412<map name="D_MINUS_ONE">src->cat6.d - 1</map>413<map name="TYPED">src</map>414<map name="TYPE_SIZE_MINUS_ONE">src->cat6.iim_val - 1</map>415<map name="SSBO">src->srcs[0]</map>416<map name="SSBO_IM">!!(src->srcs[0]->flags & IR3_REG_IMMED)</map>417<map name="SRC1">src->srcs[1]</map>418<map name="SRC1_IM">!!(src->srcs[1]->flags & IR3_REG_IMMED)</map>419<map name="SRC2">src->srcs[2]</map>420<map name="SRC2_IM">!!(src->srcs[2]->flags & IR3_REG_IMMED)</map>421</encode>422</bitset>423424<bitset name="#instruction-cat6-a3xx-ibo" extends="#instruction-cat6-a3xx">425<display>426{SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE} g[{SSBO}], {SRC1}, {SRC2}, {SRC3}427</display>428<gen max="599"/>429430<derived name="D" expr="#cat6-d" type="uint"/>431<derived name="TYPE_SIZE" expr="#cat6-type-size" type="uint"/>432433<pattern pos="0" >1</pattern>434<field low="1" high="8" name="SRC1" type="#reg-gpr"/>435<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>436<field pos="11" name="TYPED" type="#cat6-typed"/>437<field low="12" high="13" name="TYPE_SIZE_MINUS_ONE" type="uint"/>438<pattern low="14" high="22">xxxxxxxxx</pattern>439<field pos="23" name="SRC2_IM" type="bool"/>440<field low="24" high="31" name="SRC2" type="#cat6-src">441<param name="SRC2_IM" as="SRC_IM"/>442</field>443<field low="32" high="39" name="SRC3" type="#cat6-src">444<param name="SRC3_IM" as="SRC_IM"/>445</field>446<field pos="40" name="SRC3_IM" type="bool"/>447<field low="41" high="48" name="SSBO" type="#cat6-src"> <!-- SSBO/image binding point -->448<param name="SSBO_IM" as="SRC_IM"/>449</field>450<pattern pos="52" >x</pattern> <!-- G -->451<field pos="53" name="SSBO_IM" type="bool"/>452<encode>453<map name="D_MINUS_ONE">src->cat6.d - 1</map>454<map name="TYPED">src</map>455<map name="TYPE_SIZE_MINUS_ONE">src->cat6.iim_val - 1</map>456<map name="SSBO">src->srcs[0]</map>457<map name="SSBO_IM">!!(src->srcs[0]->flags & IR3_REG_IMMED)</map>458<map name="SRC1">src->srcs[1]</map>459<map name="SRC1_IM">!!(src->srcs[1]->flags & IR3_REG_IMMED)</map>460<map name="SRC2">src->srcs[2]</map>461<map name="SRC2_IM">!!(src->srcs[2]->flags & IR3_REG_IMMED)</map>462<map name="SRC3">src->srcs[3]</map>463<map name="SRC3_IM">!!(src->srcs[3]->flags & IR3_REG_IMMED)</map>464</encode>465</bitset>466467<bitset name="stgb" extends="#instruction-cat6-a3xx-ibo">468<pattern low="54" high="58">11100</pattern> <!-- OPC -->469</bitset>470471<bitset name="stib" extends="#instruction-cat6-a3xx-ibo">472<pattern low="54" high="58">11101</pattern> <!-- OPC -->473</bitset>474475<bitset name="#instruction-cat6-a3xx-atomic" extends="#instruction-cat6-a3xx">476<doc>477Base for atomic instructions (I think mostly a4xx+, as478a3xx didn't have real image/ssbo.. it was all just global).479Still used as of a6xx for local.480481NOTE that existing disasm and asm parser expect atomic inc/dec482to still have an extra src. For now, match that.483</doc>484485<override expr="#cat6-global">486<display>487{SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE}.g {DST}, g[{SSBO}], {SRC1}, {SRC2}, {SRC3}488</display>489<field low="1" high="8" name="SRC3" type="#reg-gpr"/>490<field low="41" high="48" name="SSBO" type="#cat6-src"> <!-- SSBO/image binding point -->491<param name="SSBO_IM" as="SRC_IM"/>492</field>493<field pos="53" name="SSBO_IM" type="bool"/>494</override>495<display>496{SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE}.l {DST}, l[{SRC1}], {SRC2}497</display>498499<derived name="D" expr="#cat6-d" type="uint"/>500<derived name="TYPE_SIZE" expr="#cat6-type-size" type="uint"/>501502<pattern pos="0" >1</pattern>503<pattern low="1" high="8" >xxxxxxxx</pattern> <!-- SRC3 -->504<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>505<field pos="11" name="TYPED" type="#cat6-typed"/>506<field low="12" high="13" name="TYPE_SIZE_MINUS_ONE" type="uint"/>507<field low="14" high="21" name="SRC1" type="#cat6-src">508<param name="SRC1_IM" as="SRC_IM"/>509</field>510<field pos="22" name="SRC1_IM" type="bool"/>511<field pos="23" name="SRC2_IM" type="bool"/>512<field low="24" high="31" name="SRC2" type="#cat6-src">513<param name="SRC2_IM" as="SRC_IM"/>514</field>515<field low="32" high="39" name="DST" type="#reg-gpr"/>516<pattern pos="40" >x</pattern>517<assert low="41" high="48">00000000</assert> <!-- SSBO/image binding point -->518<field pos="52" name="G" type="bool"/>519<assert pos="53" >0</assert> <!-- SSBO_IM -->520<encode>521<map name="G">!!(src->flags & IR3_INSTR_G)</map>522<map name="TYPED">src</map>523<map name="D_MINUS_ONE">src->cat6.d - 1</map>524<map name="TYPE_SIZE_MINUS_ONE">src->cat6.iim_val - 1</map>525<map name="SSBO">src->srcs[0]</map>526<map name="SSBO_IM">!!(src->srcs[0]->flags & IR3_REG_IMMED)</map>527<map name="SRC1">extract_cat6_SRC(src, 0)</map>528<map name="SRC1_IM">!!(extract_cat6_SRC(src, 0)->flags & IR3_REG_IMMED)</map>529<map name="SRC2">extract_cat6_SRC(src, 1)</map>530<map name="SRC2_IM">!!(extract_cat6_SRC(src, 1)->flags & IR3_REG_IMMED)</map>531<map name="SRC3">extract_cat6_SRC(src, 2)</map>532<map name="SRC3_IM">!!(extract_cat6_SRC(src, 2)->flags & IR3_REG_IMMED)</map>533</encode>534</bitset>535536<bitset name="#instruction-cat6-a3xx-atomic-1src" extends="#instruction-cat6-a3xx-atomic">537<!-- TODO when asm parser is updated, shift display templates, etc, here -->538</bitset>539540<bitset name="#instruction-cat6-a3xx-atomic-2src" extends="#instruction-cat6-a3xx-atomic">541<!-- TODO when asm parser is updated, shift display templates, etc, here -->542</bitset>543544<bitset name="atomic.add" extends="#instruction-cat6-a3xx-atomic-2src">545<pattern low="54" high="58">10000</pattern> <!-- OPC -->546</bitset>547548<bitset name="atomic.sub" extends="#instruction-cat6-a3xx-atomic-2src">549<pattern low="54" high="58">10001</pattern> <!-- OPC -->550</bitset>551552<bitset name="atomic.xchg" extends="#instruction-cat6-a3xx-atomic-2src">553<pattern low="54" high="58">10010</pattern> <!-- OPC -->554</bitset>555556<bitset name="atomic.inc" extends="#instruction-cat6-a3xx-atomic-1src">557<pattern low="54" high="58">10011</pattern> <!-- OPC -->558</bitset>559560<bitset name="atomic.dec" extends="#instruction-cat6-a3xx-atomic-1src">561<pattern low="54" high="58">10100</pattern> <!-- OPC -->562</bitset>563564<bitset name="atomic.cmpxchg" extends="#instruction-cat6-a3xx-atomic-2src">565<pattern low="54" high="58">10101</pattern> <!-- OPC -->566</bitset>567568<bitset name="atomic.min" extends="#instruction-cat6-a3xx-atomic-2src">569<pattern low="54" high="58">10110</pattern> <!-- OPC -->570</bitset>571572<bitset name="atomic.max" extends="#instruction-cat6-a3xx-atomic-2src">573<pattern low="54" high="58">10111</pattern> <!-- OPC -->574</bitset>575576<bitset name="atomic.and" extends="#instruction-cat6-a3xx-atomic-2src">577<pattern low="54" high="58">11000</pattern> <!-- OPC -->578</bitset>579580<bitset name="atomic.or" extends="#instruction-cat6-a3xx-atomic-2src">581<pattern low="54" high="58">11001</pattern> <!-- OPC -->582</bitset>583584<bitset name="atomic.xor" extends="#instruction-cat6-a3xx-atomic-2src">585<pattern low="54" high="58">11010</pattern> <!-- OPC -->586</bitset>587588589<!--590New a6xx+ encodings for potentially bindless image/ssbo:591-->592593<bitset name="#instruction-cat6-a6xx" extends="#instruction-cat6">594<doc>595Base for new instruction encoding that started being used596with a6xx for instructions supporting bindless mode.597</doc>598<gen min="600"/>599600<derived name="TYPE_SIZE" expr="#cat6-type-size" type="uint"/>601602<field low="1" high="3" name="BASE" type="#cat6-base">603<param name="BINDLESS"/>604</field>605<pattern low="4" high="5" >00</pattern>606<field low="6" high="7" name="MODE" type="#cat6-src-mode"/>607<field pos="8" name="BINDLESS" type="bool"/>608<field low="12" high="13" name="TYPE_SIZE_MINUS_ONE" type="uint"/>609<pattern pos="40" >0</pattern>610<pattern low="54" high="58">00000</pattern>611<encode>612<map name="MODE">extract_cat6_DESC_MODE(src)</map>613<map name="TYPE_SIZE_MINUS_ONE">src->cat6.iim_val - 1</map>614<map name="BINDLESS">!!(src->flags & IR3_INSTR_B)</map>615<map name="BASE">src</map>616</encode>617</bitset>618619<bitset name="ldc" extends="#instruction-cat6-a6xx">620<doc>621LoaD Constant - UBO load622</doc>623<override>624<!-- TODO.. wtf? -->625<expr>{K}</expr>626<display>627{SY}{JP}{NAME}.{TYPE_SIZE}.k.{MODE}{BASE} c[a1.x], {SRC1}, {SRC2}628</display>629<field low="32" high="39" name="TYPE_SIZE_MINUS_ONE" type="uint"/>630</override>631<!--632TODO are these *really* all bindless? Or does that bit have a different633meaning? Maybe I don't have enough ldc examples from deqp-glesN634-->635<display>636{SY}{JP}{NAME}.offset{OFFSET}.{TYPE_SIZE}.{MODE}{BASE} {DST}, {SRC1}, {SRC2}637</display>638<pattern pos="0" >x</pattern>639<field low="9" high="10" name="OFFSET" type="uint"/> <!-- D_MINUS_ONE -->640<pattern pos="11" >x</pattern> <!-- TYPED -->641<pattern low="14" high="19">011110</pattern> <!-- OPC -->642<pattern low="20" high="22">1xx</pattern>643<field pos="23" name="SRC1_IM" type="bool"/>644<derived name="SRC2_IM" expr="#cat6-direct" type="bool"/>645<field low="41" high="48" name="SRC2" type="#cat6-src">646<param name="SRC2_IM" as="SRC_IM"/>647</field>648<field low="24" high="31" name="SRC1" type="#cat6-src">649<param name="SRC1_IM" as="SRC_IM"/>650</field>651<field low="32" high="39" name="DST" type="#reg-gpr"/>652<pattern low="49" high="51">x11</pattern> <!-- TYPE -->653<field pos="52" name="K" type="bool"/>654<pattern pos="53" >1</pattern>655<encode>656<map name="K">0</map> <!-- TODO.. once we figure out what this is -->657<map name="SRC1_IM">!!(src->srcs[1]->flags & IR3_REG_IMMED)</map>658<map name="OFFSET">src->cat6.d</map>659<map name="SRC1">src->srcs[1]</map>660<map name="SRC2">src->srcs[0]</map>661</encode>662</bitset>663664<bitset name="getspid" extends="#instruction-cat6-a6xx">665<doc>666GET Shader Processor ID?667</doc>668<display>669{SY}{JP}{NAME}.{TYPE} {DST}670</display>671672<pattern pos="0" >0</pattern>673<pattern low="9" high="10">xx</pattern> <!-- D_MINUS_ONE -->674<pattern pos="11" >x</pattern> <!-- TYPED -->675<pattern low="14" high="19">100100</pattern> <!-- OPC -->676<pattern low="20" high="23">x1xx</pattern>677<pattern low="24" high="31">xxxxxxxx</pattern> <!-- SRC2 -->678<field low="32" high="39" name="DST" type="#reg-gpr"/>679<pattern low="41" high="48">xxxxxxxx</pattern> <!-- SSBO/image binding point -->680<field low="49" high="51" name="TYPE" type="#type"/>681<pattern low="52" high="53">1x</pattern>682</bitset>683684<bitset name="getwid" extends="#instruction-cat6-a6xx">685<doc>686GET Wavefront ID687</doc>688<display>689{SY}{JP}{NAME}.{TYPE} {DST}690</display>691692<pattern pos="0" >0</pattern>693<pattern low="9" high="10">xx</pattern> <!-- D_MINUS_ONE -->694<pattern pos="11" >x</pattern> <!-- TYPED -->695<pattern low="14" high="19">100101</pattern> <!-- OPC -->696<pattern low="20" high="23">x1xx</pattern>697<pattern low="24" high="31">xxxxxxxx</pattern> <!-- SRC2 -->698<field low="32" high="39" name="DST" type="#reg-gpr"/>699<pattern low="41" high="48">xxxxxxxx</pattern> <!-- SSBO/image binding point -->700<field low="49" high="51" name="TYPE" type="#type"/>701<pattern low="52" high="53">1x</pattern>702</bitset>703704<bitset name="resinfo.b" extends="#instruction-cat6-a6xx">705<doc>706RESourceINFO - returns image/ssbo dimensions (3 components)707</doc>708<display>709{SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE}.{MODE}{BASE} {DST}, {SSBO}710</display>711712<derived name="D" expr="#cat6-d" type="uint"/>713<derived name="TRUE" expr="#true" type="bool"/>714715<pattern pos="0" >0</pattern>716<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>717<field pos="11" name="TYPED" type="#cat6-typed"/>718<pattern low="14" high="19">001111</pattern> <!-- OPC -->719<pattern low="20" high="23">0110</pattern>720<pattern low="24" high="31">xxxxxxxx</pattern> <!-- SRC2 -->721<field low="32" high="39" name="DST" type="#reg-gpr"/>722<field low="41" high="48" name="SSBO" type="#cat6-src"> <!-- SSBO/image binding point -->723<param name="TRUE" as="SRC_IM"/>724</field>725<field low="49" high="51" name="TYPE" type="#type"/>726<pattern low="52" high="53">1x</pattern>727<encode>728<map name="D_MINUS_ONE">src->cat6.d - 1</map>729<map name="TYPED">src</map>730<map name="SSBO">src->srcs[0]</map>731<map name="SRC1">src->srcs[1]</map>732</encode>733</bitset>734735<bitset name="#instruction-cat6-a6xx-ibo" extends="#instruction-cat6-a6xx">736<doc>737IBO (ie. Image/SSBO) instructions738</doc>739<display>740{SY}{JP}{NAME}.{TYPED}.{D}d.{TYPE}.{TYPE_SIZE}.{MODE}{BASE} {SRC1}, {SRC2}, {SSBO}741</display>742743<derived name="D" expr="#cat6-d" type="uint"/>744<derived name="TRUE" expr="#true" type="bool"/>745746<field low="9" high="10" name="D_MINUS_ONE" type="uint"/>747<field pos="11" name="TYPED" type="#cat6-typed"/>748<pattern low="20" high="23">0110</pattern>749<field low="24" high="31" name="SRC2" type="#reg-gpr"/>750<field low="32" high="39" name="SRC1" type="#reg-gpr"/>751<field low="41" high="48" name="SSBO" type="#cat6-src"> <!-- SSBO/image binding point -->752<param name="SSBO_IM" as="SRC_IM"/>753</field>754<derived name="SSBO_IM" expr="#cat6-direct" type="bool"/>755<field low="49" high="51" name="TYPE" type="#type"/>756<encode>757<map name="TYPED">src</map>758<map name="D_MINUS_ONE">src->cat6.d - 1</map>759<map name="SSBO">src->srcs[0]</map>760<map name="SRC1">src->srcs[2]</map>761<map name="SRC2">src->srcs[1]</map>762</encode>763</bitset>764765<bitset name="stib.b" extends="#instruction-cat6-a6xx-ibo">766<doc>767STore IBo768</doc>769<pattern pos="0" >0</pattern>770<pattern low="14" high="19">011101</pattern> <!-- OPC -->771<pattern low="52" high="53">10</pattern>772</bitset>773774<bitset name="ldib.b" extends="#instruction-cat6-a6xx-ibo">775<doc>776LoaD IBo777</doc>778<pattern pos="0" >x</pattern> <!-- blob seems to set randomly? -->779<pattern low="14" high="19">000110</pattern> <!-- OPC -->780<pattern low="52" high="53">10</pattern>781<encode>782<map name="SRC1">src->dsts[0]</map>783</encode>784</bitset>785786<bitset name="atomic.b.add" extends="#instruction-cat6-a6xx-ibo">787<pattern pos="0" >x</pattern>788<pattern low="14" high="19">010000</pattern> <!-- OPC -->789<pattern low="52" high="53">11</pattern>790</bitset>791792<bitset name="atomic.b.sub" extends="#instruction-cat6-a6xx-ibo">793<pattern pos="0" >x</pattern>794<pattern low="14" high="19">010001</pattern> <!-- OPC -->795<pattern low="52" high="53">11</pattern>796</bitset>797798<bitset name="atomic.b.xchg" extends="#instruction-cat6-a6xx-ibo">799<pattern pos="0" >x</pattern>800<pattern low="14" high="19">010010</pattern> <!-- OPC -->801<pattern low="52" high="53">11</pattern>802</bitset>803804<!-- inc/dec? -->805806<bitset name="atomic.b.cmpxchg" extends="#instruction-cat6-a6xx-ibo">807<pattern pos="0" >x</pattern>808<pattern low="14" high="19">010101</pattern> <!-- OPC -->809<pattern low="52" high="53">11</pattern>810</bitset>811812<bitset name="atomic.b.min" extends="#instruction-cat6-a6xx-ibo">813<pattern pos="0" >x</pattern>814<pattern low="14" high="19">010110</pattern> <!-- OPC -->815<pattern low="52" high="53">11</pattern>816</bitset>817818<bitset name="atomic.b.max" extends="#instruction-cat6-a6xx-ibo">819<pattern pos="0" >x</pattern>820<pattern low="14" high="19">010111</pattern> <!-- OPC -->821<pattern low="52" high="53">11</pattern>822</bitset>823824<bitset name="atomic.b.and" extends="#instruction-cat6-a6xx-ibo">825<pattern pos="0" >x</pattern>826<pattern low="14" high="19">011000</pattern> <!-- OPC -->827<pattern low="52" high="53">11</pattern>828</bitset>829830<bitset name="atomic.b.or" extends="#instruction-cat6-a6xx-ibo">831<pattern pos="0" >x</pattern>832<pattern low="14" high="19">011001</pattern> <!-- OPC -->833<pattern low="52" high="53">11</pattern>834</bitset>835836<bitset name="atomic.b.xor" extends="#instruction-cat6-a6xx-ibo">837<pattern pos="0" >x</pattern>838<pattern low="14" high="19">011010</pattern> <!-- OPC -->839<pattern low="52" high="53">11</pattern>840</bitset>841842843844<expr name="#cat6-d">845{D_MINUS_ONE} + 1846</expr>847848<expr name="#cat6-type-size">849{TYPE_SIZE_MINUS_ONE} + 1850</expr>851852<!-- Image/SSBO (ie. not local) -->853<expr name="#cat6-global">854{G}855</expr>856857<bitset name="#cat6-typed" size="1">858<override>859<expr>{TYPED}</expr>860<display>861typed862</display>863</override>864<display>865untyped866</display>867<field name="TYPED" pos="0" type="bool"/>868<encode type="struct ir3_instruction *">869<map name="TYPED" force="true">src->cat6.typed</map>870</encode>871</bitset>872873<bitset name="#cat6-base" size="3">874<override>875<expr>{BINDLESS}</expr>876<display>877.base{BASE}878</display>879</override>880<display/>881<field name="BASE" low="0" high="2" type="uint"/>882<encode type="struct ir3_instruction *">883<map name="BASE">src->cat6.base</map>884</encode>885</bitset>886887<bitset name="#cat6-src" size="8">888<doc>889Source value that can be either immed or gpr890</doc>891<override>892<expr>{SRC_IM}</expr>893<display>894{IMMED}895</display>896<field name="IMMED" low="0" high="7" type="int"/>897</override>898<display>899r{GPR}.{SWIZ}900</display>901<field name="SWIZ" low="0" high="1" type="#swiz"/>902<field name="GPR" low="2" high="7" type="uint"/>903<encode type="struct ir3_register *">904<map name="GPR">src->num >> 2</map>905<map name="SWIZ">src->num & 0x3</map>906<map name="IMMED">src->iim_val</map>907</encode>908</bitset>909910<expr name="#cat6-direct">911{MODE} == 0912</expr>913914<enum name="#cat6-src-mode">915<doc>916Source mode for "new" a6xx+ instruction encodings917</doc>918<value val="0" display="imm">919<doc>920Immediate index.921</doc>922</value>923<value val="1" display="uniform">924<doc>925Index from a uniform register (ie. does not depend on flow control)926</doc>927</value>928<value val="2" display="nonuniform">929<doc>930Index from a non-uniform register (ie. potentially depends on flow control)931</doc>932</value>933</enum>934935</isa>936937938