1bf215546Sopenharmony_ci<?xml version="1.0" encoding="UTF-8"?> 2bf215546Sopenharmony_ci<!-- 3bf215546Sopenharmony_ciCopyright © 2020 Google, Inc. 4bf215546Sopenharmony_ci 5bf215546Sopenharmony_ciPermission is hereby granted, free of charge, to any person obtaining a 6bf215546Sopenharmony_cicopy of this software and associated documentation files (the "Software"), 7bf215546Sopenharmony_cito deal in the Software without restriction, including without limitation 8bf215546Sopenharmony_cithe rights to use, copy, modify, merge, publish, distribute, sublicense, 9bf215546Sopenharmony_ciand/or sell copies of the Software, and to permit persons to whom the 10bf215546Sopenharmony_ciSoftware is furnished to do so, subject to the following conditions: 11bf215546Sopenharmony_ci 12bf215546Sopenharmony_ciThe above copyright notice and this permission notice (including the next 13bf215546Sopenharmony_ciparagraph) shall be included in all copies or substantial portions of the 14bf215546Sopenharmony_ciSoftware. 15bf215546Sopenharmony_ci 16bf215546Sopenharmony_ciTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17bf215546Sopenharmony_ciIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18bf215546Sopenharmony_ciFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19bf215546Sopenharmony_ciTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20bf215546Sopenharmony_ciLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21bf215546Sopenharmony_ciOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22bf215546Sopenharmony_ciSOFTWARE. 23bf215546Sopenharmony_ci --> 24bf215546Sopenharmony_ci 25bf215546Sopenharmony_ci<isa> 26bf215546Sopenharmony_ci 27bf215546Sopenharmony_ci<!-- 28bf215546Sopenharmony_ci Cat1 Instruction(s): 29bf215546Sopenharmony_ci --> 30bf215546Sopenharmony_ci 31bf215546Sopenharmony_ci<bitset name="#cat1-dst" size="8"> 32bf215546Sopenharmony_ci <doc> 33bf215546Sopenharmony_ci Unlike other instruction categories, cat1 can have relative dest 34bf215546Sopenharmony_ci </doc> 35bf215546Sopenharmony_ci <override> 36bf215546Sopenharmony_ci <expr> 37bf215546Sopenharmony_ci ({OFFSET} == 0) && {DST_REL} 38bf215546Sopenharmony_ci </expr> 39bf215546Sopenharmony_ci <display> 40bf215546Sopenharmony_ci r<a0.x> 41bf215546Sopenharmony_ci </display> 42bf215546Sopenharmony_ci <field name="OFFSET" low="0" high="7" type="uint"/> 43bf215546Sopenharmony_ci </override> 44bf215546Sopenharmony_ci <override> 45bf215546Sopenharmony_ci <expr> 46bf215546Sopenharmony_ci {DST_REL} 47bf215546Sopenharmony_ci </expr> 48bf215546Sopenharmony_ci <display> 49bf215546Sopenharmony_ci r<a0.x + {OFFSET}> 50bf215546Sopenharmony_ci </display> 51bf215546Sopenharmony_ci <field name="OFFSET" low="0" high="7" type="uint"/> 52bf215546Sopenharmony_ci </override> 53bf215546Sopenharmony_ci <display> 54bf215546Sopenharmony_ci {DST} 55bf215546Sopenharmony_ci </display> 56bf215546Sopenharmony_ci <field name="DST" low="0" high="7" type="#reg-gpr"/> 57bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 58bf215546Sopenharmony_ci <map name="DST">src</map> 59bf215546Sopenharmony_ci <map name="OFFSET">src->array.offset</map> 60bf215546Sopenharmony_ci </encode> 61bf215546Sopenharmony_ci</bitset> 62bf215546Sopenharmony_ci 63bf215546Sopenharmony_ci<enum name="#round"> 64bf215546Sopenharmony_ci <value val="0" display=""/> 65bf215546Sopenharmony_ci <value val="1" display="(even)"/> 66bf215546Sopenharmony_ci <value val="2" display="(pos_infinity)"/> 67bf215546Sopenharmony_ci <value val="3" display="(neg_infinity)"/> 68bf215546Sopenharmony_ci</enum> 69bf215546Sopenharmony_ci 70bf215546Sopenharmony_ci<bitset name="#instruction-cat1" extends="#instruction"> 71bf215546Sopenharmony_ci <pattern pos="42">0</pattern> 72bf215546Sopenharmony_ci <field name="SS" pos="44" type="bool" display="(ss)"/> 73bf215546Sopenharmony_ci <field name="UL" pos="45" type="bool" display="(ul)"/> 74bf215546Sopenharmony_ci <field name="ROUND" low="55" high="56" type="#round"/> 75bf215546Sopenharmony_ci <field name="JP" pos="59" type="bool" display="(jp)"/> 76bf215546Sopenharmony_ci <field name="SY" pos="60" type="bool" display="(sy)"/> 77bf215546Sopenharmony_ci <pattern low="61" high="63">001</pattern> <!-- cat1 --> 78bf215546Sopenharmony_ci <encode> 79bf215546Sopenharmony_ci <map name="SRC">src->srcs[0]</map> 80bf215546Sopenharmony_ci <map name="SRC_R">!!(src->srcs[0]->flags & IR3_REG_R)</map> 81bf215546Sopenharmony_ci <map name="UL">!!(src->flags & IR3_INSTR_UL)</map> 82bf215546Sopenharmony_ci <map name="DST_REL">!!(src->dsts[0]->flags & IR3_REG_RELATIV)</map> 83bf215546Sopenharmony_ci <map name="ROUND">src->cat1.round</map> 84bf215546Sopenharmony_ci </encode> 85bf215546Sopenharmony_ci</bitset> 86bf215546Sopenharmony_ci 87bf215546Sopenharmony_ci<bitset name="#instruction-cat1-typed" extends="#instruction-cat1"> 88bf215546Sopenharmony_ci <derived name="HALF" type="bool" display="h"> 89bf215546Sopenharmony_ci <expr> 90bf215546Sopenharmony_ci ({SRC_TYPE} == 0) /* f16 */ || 91bf215546Sopenharmony_ci ({SRC_TYPE} == 2) /* u16 */ || 92bf215546Sopenharmony_ci ({SRC_TYPE} == 4) /* s16 */ || 93bf215546Sopenharmony_ci ({SRC_TYPE} == 6) /* u8 */ || 94bf215546Sopenharmony_ci ({SRC_TYPE} == 7) /* s8 */ 95bf215546Sopenharmony_ci </expr> 96bf215546Sopenharmony_ci </derived> 97bf215546Sopenharmony_ci <derived name="DST_HALF" type="bool" display="h"> 98bf215546Sopenharmony_ci <expr> 99bf215546Sopenharmony_ci ({DST_TYPE} == 0) /* f16 */ || 100bf215546Sopenharmony_ci ({DST_TYPE} == 2) /* u16 */ || 101bf215546Sopenharmony_ci ({DST_TYPE} == 4) /* s16 */ || 102bf215546Sopenharmony_ci ({DST_TYPE} == 6) /* u8 */ || 103bf215546Sopenharmony_ci ({DST_TYPE} == 7) /* s8 */ 104bf215546Sopenharmony_ci </expr> 105bf215546Sopenharmony_ci </derived> 106bf215546Sopenharmony_ci <field name="DST_TYPE" low="46" high="48" type="#type"/> 107bf215546Sopenharmony_ci <field name="SRC_TYPE" low="50" high="52" type="#type"/> 108bf215546Sopenharmony_ci 109bf215546Sopenharmony_ci <encode> 110bf215546Sopenharmony_ci <map name="DST_TYPE">src->cat1.dst_type</map> 111bf215546Sopenharmony_ci <map name="SRC_TYPE">src->cat1.src_type</map> 112bf215546Sopenharmony_ci </encode> 113bf215546Sopenharmony_ci</bitset> 114bf215546Sopenharmony_ci 115bf215546Sopenharmony_ci<bitset name="#instruction-cat1-mov" extends="#instruction-cat1-typed"> 116bf215546Sopenharmony_ci <override> 117bf215546Sopenharmony_ci <expr> 118bf215546Sopenharmony_ci ({DST} == 0xf4 /* a0.x */) && ({SRC_TYPE} == 4 /* s16 */) && ({DST_TYPE} == 4) 119bf215546Sopenharmony_ci </expr> 120bf215546Sopenharmony_ci <display> 121bf215546Sopenharmony_ci {SY}{SS}{JP}{REPEAT}{UL}mova {ROUND}a0.x, {SRC} 122bf215546Sopenharmony_ci </display> 123bf215546Sopenharmony_ci <assert low="32" high="39">11110100</assert> <!-- DST==a0.x --> 124bf215546Sopenharmony_ci <assert low="46" high="48">100</assert> <!-- DST_TYPE==s16 --> 125bf215546Sopenharmony_ci <assert low="50" high="52">100</assert> <!-- SRC_TYPE==s16 --> 126bf215546Sopenharmony_ci </override> 127bf215546Sopenharmony_ci <override> 128bf215546Sopenharmony_ci <expr> 129bf215546Sopenharmony_ci ({DST} == 0xf5 /* a0.y */) && ({SRC_TYPE} == 2 /* u16 */) && ({DST_TYPE} == 2) 130bf215546Sopenharmony_ci </expr> 131bf215546Sopenharmony_ci <display> 132bf215546Sopenharmony_ci {SY}{SS}{JP}{REPEAT}{UL}mova1 {ROUND}a1.x, {SRC} 133bf215546Sopenharmony_ci </display> 134bf215546Sopenharmony_ci <assert low="32" high="39">11110101</assert> <!-- DST==a0.y --> 135bf215546Sopenharmony_ci <assert low="46" high="48">010</assert> <!-- DST_TYPE==u16 --> 136bf215546Sopenharmony_ci <assert low="50" high="52">010</assert> <!-- SRC_TYPE==u16 --> 137bf215546Sopenharmony_ci </override> 138bf215546Sopenharmony_ci <override> 139bf215546Sopenharmony_ci <expr> 140bf215546Sopenharmony_ci {SRC_TYPE} != {DST_TYPE} 141bf215546Sopenharmony_ci </expr> 142bf215546Sopenharmony_ci <display> 143bf215546Sopenharmony_ci {SY}{SS}{JP}{REPEAT}{UL}cov.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC} 144bf215546Sopenharmony_ci </display> 145bf215546Sopenharmony_ci </override> 146bf215546Sopenharmony_ci <display> 147bf215546Sopenharmony_ci {SY}{SS}{JP}{REPEAT}{UL}mov.{SRC_TYPE}{DST_TYPE} {ROUND}{DST_HALF}{DST}, {SRC} 148bf215546Sopenharmony_ci </display> 149bf215546Sopenharmony_ci <field name="DST" low="32" high="39" type="#cat1-dst"> 150bf215546Sopenharmony_ci <param name="DST_REL"/> 151bf215546Sopenharmony_ci </field> 152bf215546Sopenharmony_ci <field name="REPEAT" low="40" high="41" type="#rptN"/> 153bf215546Sopenharmony_ci <field name="DST_REL" pos="49" type="bool"/> 154bf215546Sopenharmony_ci <pattern low="57" high="58">00</pattern> <!-- OPC --> 155bf215546Sopenharmony_ci</bitset> 156bf215546Sopenharmony_ci 157bf215546Sopenharmony_ci<!-- 158bf215546Sopenharmony_ci Helpers for displaying cat1 source forms.. split out so the toplevel 159bf215546Sopenharmony_ci instruction can just refer to {SRC}. This decouples the cov/mov/mova 160bf215546Sopenharmony_ci permultations from the different src type permutations 161bf215546Sopenharmony_ci --> 162bf215546Sopenharmony_ci 163bf215546Sopenharmony_ci<bitset name="#cat1-immed-src" size="32"> 164bf215546Sopenharmony_ci <override> 165bf215546Sopenharmony_ci <expr> 166bf215546Sopenharmony_ci {SRC_TYPE} == 0 /* f16 */ 167bf215546Sopenharmony_ci </expr> 168bf215546Sopenharmony_ci <display> 169bf215546Sopenharmony_ci h({IMMED}) 170bf215546Sopenharmony_ci </display> 171bf215546Sopenharmony_ci <field name="IMMED" low="0" high="15" type="float"/> 172bf215546Sopenharmony_ci </override> 173bf215546Sopenharmony_ci <override> 174bf215546Sopenharmony_ci <expr> 175bf215546Sopenharmony_ci {SRC_TYPE} == 1 /* f32 */ 176bf215546Sopenharmony_ci </expr> 177bf215546Sopenharmony_ci <display> 178bf215546Sopenharmony_ci ({IMMED}) 179bf215546Sopenharmony_ci </display> 180bf215546Sopenharmony_ci <field name="IMMED" low="0" high="31" type="float"/> 181bf215546Sopenharmony_ci </override> 182bf215546Sopenharmony_ci <override> 183bf215546Sopenharmony_ci <expr> 184bf215546Sopenharmony_ci ({SRC_TYPE} == 3 /* u32 */) && ({IMMED} > 0x1000) 185bf215546Sopenharmony_ci </expr> 186bf215546Sopenharmony_ci <display> 187bf215546Sopenharmony_ci 0x{IMMED} 188bf215546Sopenharmony_ci </display> 189bf215546Sopenharmony_ci <field name="IMMED" low="0" high="31" type="hex"/> 190bf215546Sopenharmony_ci </override> 191bf215546Sopenharmony_ci <override> 192bf215546Sopenharmony_ci <expr> 193bf215546Sopenharmony_ci {SRC_TYPE} == 4 /* s16 */ 194bf215546Sopenharmony_ci </expr> 195bf215546Sopenharmony_ci <field name="IMMED" low="0" high="15" type="int"/> 196bf215546Sopenharmony_ci </override> 197bf215546Sopenharmony_ci <override> 198bf215546Sopenharmony_ci <expr> 199bf215546Sopenharmony_ci {SRC_TYPE} == 5 /* s32 */ 200bf215546Sopenharmony_ci </expr> 201bf215546Sopenharmony_ci <field name="IMMED" low="0" high="31" type="int"/> 202bf215546Sopenharmony_ci </override> 203bf215546Sopenharmony_ci 204bf215546Sopenharmony_ci <display> 205bf215546Sopenharmony_ci {IMMED} 206bf215546Sopenharmony_ci </display> 207bf215546Sopenharmony_ci 208bf215546Sopenharmony_ci <field name="IMMED" low="0" high="31" type="uint"/> 209bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 210bf215546Sopenharmony_ci <map name="IMMED">extract_reg_uim(src)</map> 211bf215546Sopenharmony_ci </encode> 212bf215546Sopenharmony_ci</bitset> 213bf215546Sopenharmony_ci 214bf215546Sopenharmony_ci<bitset name="#cat1-const-src" size="11"> 215bf215546Sopenharmony_ci <display> 216bf215546Sopenharmony_ci {SRC_R}{HALF}{CONST} 217bf215546Sopenharmony_ci </display> 218bf215546Sopenharmony_ci <field name="CONST" low="0" high="10" type="#reg-const"/> 219bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 220bf215546Sopenharmony_ci <map name="CONST">src</map> 221bf215546Sopenharmony_ci </encode> 222bf215546Sopenharmony_ci</bitset> 223bf215546Sopenharmony_ci 224bf215546Sopenharmony_ci<bitset name="#cat1-gpr-src" size="8"> 225bf215546Sopenharmony_ci <display> 226bf215546Sopenharmony_ci {SRC_R}{HALF}{SRC} 227bf215546Sopenharmony_ci </display> 228bf215546Sopenharmony_ci <field name="SRC" low="0" high="7" type="#reg-gpr"/> 229bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 230bf215546Sopenharmony_ci <map name="SRC">src</map> 231bf215546Sopenharmony_ci </encode> 232bf215546Sopenharmony_ci</bitset> 233bf215546Sopenharmony_ci 234bf215546Sopenharmony_ci<bitset name="#cat1-relative-gpr-src" size="10"> 235bf215546Sopenharmony_ci <display> 236bf215546Sopenharmony_ci {SRC_R}{HALF}{SRC} 237bf215546Sopenharmony_ci </display> 238bf215546Sopenharmony_ci <field name="SRC" low="0" high="9" type="#reg-relative-gpr"/> 239bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 240bf215546Sopenharmony_ci <map name="SRC">src</map> 241bf215546Sopenharmony_ci </encode> 242bf215546Sopenharmony_ci</bitset> 243bf215546Sopenharmony_ci 244bf215546Sopenharmony_ci<bitset name="#cat1-relative-const-src" size="10"> 245bf215546Sopenharmony_ci <display> 246bf215546Sopenharmony_ci {SRC_R}{HALF}{SRC} 247bf215546Sopenharmony_ci </display> 248bf215546Sopenharmony_ci <field name="SRC" low="0" high="9" type="#reg-relative-const"/> 249bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 250bf215546Sopenharmony_ci <map name="SRC">src</map> 251bf215546Sopenharmony_ci </encode> 252bf215546Sopenharmony_ci</bitset> 253bf215546Sopenharmony_ci 254bf215546Sopenharmony_ci<!-- 255bf215546Sopenharmony_ci cov/mov/mova permutations based on src type: 256bf215546Sopenharmony_ci --> 257bf215546Sopenharmony_ci 258bf215546Sopenharmony_ci<bitset name="mov-immed" extends="#instruction-cat1-mov"> 259bf215546Sopenharmony_ci <field name="SRC" low="0" high="31" type="#cat1-immed-src"> 260bf215546Sopenharmony_ci <param name="SRC_TYPE"/> 261bf215546Sopenharmony_ci </field> 262bf215546Sopenharmony_ci <pattern pos="43">0</pattern> <!-- SRC_R --> 263bf215546Sopenharmony_ci <pattern low="53" high="54">10</pattern> 264bf215546Sopenharmony_ci</bitset> 265bf215546Sopenharmony_ci 266bf215546Sopenharmony_ci<bitset name="mov-const" extends="#instruction-cat1-mov"> 267bf215546Sopenharmony_ci <field name="SRC" low="0" high="10" type="#cat1-const-src"> 268bf215546Sopenharmony_ci <param name="SRC_R"/> 269bf215546Sopenharmony_ci <param name="HALF"/> 270bf215546Sopenharmony_ci </field> 271bf215546Sopenharmony_ci <pattern low="11" high="31">000000000000000000000</pattern> 272bf215546Sopenharmony_ci <field name="SRC_R" pos="43" type="bool" display="(r)"/> 273bf215546Sopenharmony_ci <pattern low="53" high="54">01</pattern> 274bf215546Sopenharmony_ci</bitset> 275bf215546Sopenharmony_ci 276bf215546Sopenharmony_ci<bitset name="mov-gpr" extends="#instruction-cat1-mov"> 277bf215546Sopenharmony_ci <field name="SRC" low="0" high="7" type="#cat1-gpr-src"> 278bf215546Sopenharmony_ci <param name="SRC_R"/> 279bf215546Sopenharmony_ci <param name="HALF"/> 280bf215546Sopenharmony_ci </field> 281bf215546Sopenharmony_ci <pattern low="8" high="31">000000000000000000000000</pattern> 282bf215546Sopenharmony_ci <field name="SRC_R" pos="43" type="bool" display="(r)"/> 283bf215546Sopenharmony_ci <pattern low="53" high="54">00</pattern> 284bf215546Sopenharmony_ci</bitset> 285bf215546Sopenharmony_ci 286bf215546Sopenharmony_ci<bitset name="#instruction-cat1-relative" extends="#instruction-cat1-mov"> 287bf215546Sopenharmony_ci <pattern pos="11">1</pattern> 288bf215546Sopenharmony_ci <pattern low="12" high="31">00000000000000000000</pattern> 289bf215546Sopenharmony_ci <field name="SRC_R" pos="43" type="bool" display="(r)"/> 290bf215546Sopenharmony_ci <pattern low="53" high="54">00</pattern> 291bf215546Sopenharmony_ci</bitset> 292bf215546Sopenharmony_ci 293bf215546Sopenharmony_ci<bitset name="mov-relgpr" extends="#instruction-cat1-relative"> 294bf215546Sopenharmony_ci <field name="SRC" low="0" high="9" type="#cat1-relative-gpr-src"> 295bf215546Sopenharmony_ci <param name="SRC_R"/> 296bf215546Sopenharmony_ci <param name="HALF"/> 297bf215546Sopenharmony_ci </field> 298bf215546Sopenharmony_ci <pattern pos="10">0</pattern> 299bf215546Sopenharmony_ci</bitset> 300bf215546Sopenharmony_ci 301bf215546Sopenharmony_ci<bitset name="mov-relconst" extends="#instruction-cat1-relative"> 302bf215546Sopenharmony_ci <field name="SRC" low="0" high="9" type="#cat1-relative-const-src"> 303bf215546Sopenharmony_ci <param name="SRC_R"/> 304bf215546Sopenharmony_ci <param name="HALF"/> 305bf215546Sopenharmony_ci </field> 306bf215546Sopenharmony_ci <pattern pos="10">1</pattern> 307bf215546Sopenharmony_ci</bitset> 308bf215546Sopenharmony_ci 309bf215546Sopenharmony_ci<!-- 310bf215546Sopenharmony_ci Other newer cat1 instructions 311bf215546Sopenharmony_ci --> 312bf215546Sopenharmony_ci 313bf215546Sopenharmony_ci<bitset name="#cat1-multi-src" size="8"> 314bf215546Sopenharmony_ci <display> 315bf215546Sopenharmony_ci {HALF}{REG} 316bf215546Sopenharmony_ci </display> 317bf215546Sopenharmony_ci <field name="REG" low="0" high="7" type="#reg-gpr"/> 318bf215546Sopenharmony_ci 319bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 320bf215546Sopenharmony_ci <map name="REG">src</map> 321bf215546Sopenharmony_ci </encode> 322bf215546Sopenharmony_ci</bitset> 323bf215546Sopenharmony_ci 324bf215546Sopenharmony_ci<bitset name="#cat1-multi-dst" size="8"> 325bf215546Sopenharmony_ci <display> 326bf215546Sopenharmony_ci {DST_HALF}{REG} 327bf215546Sopenharmony_ci </display> 328bf215546Sopenharmony_ci 329bf215546Sopenharmony_ci <field name="REG" low="0" high="7" type="#reg-gpr"/> 330bf215546Sopenharmony_ci 331bf215546Sopenharmony_ci <encode type="struct ir3_register *"> 332bf215546Sopenharmony_ci <map name="REG">src</map> 333bf215546Sopenharmony_ci </encode> 334bf215546Sopenharmony_ci</bitset> 335bf215546Sopenharmony_ci 336bf215546Sopenharmony_ci<bitset name="#instruction-cat1-multi" extends="#instruction-cat1-typed"> 337bf215546Sopenharmony_ci <doc> 338bf215546Sopenharmony_ci These instructions all expand to a series of mov instructions, 339bf215546Sopenharmony_ci like (rptN) but more flexible. They aren't any faster than the 340bf215546Sopenharmony_ci equivalent sequence of mov/cov, but they guarantee that all 341bf215546Sopenharmony_ci sources are read before any destination is written, so they 342bf215546Sopenharmony_ci behave as-if the moves are executed in parallel. 343bf215546Sopenharmony_ci </doc> 344bf215546Sopenharmony_ci 345bf215546Sopenharmony_ci <gen min="500"/> <!-- TODO does a4xx support these? --> 346bf215546Sopenharmony_ci 347bf215546Sopenharmony_ci <field name="SRC0" low="0" high="7" type="#cat1-multi-src"> 348bf215546Sopenharmony_ci <param name="HALF"/> 349bf215546Sopenharmony_ci </field> 350bf215546Sopenharmony_ci <field name="DST0" low="32" high="39" type="#cat1-multi-dst"> 351bf215546Sopenharmony_ci <param name="DST_HALF"/> 352bf215546Sopenharmony_ci </field> 353bf215546Sopenharmony_ci <pattern pos="43">0</pattern> <!-- SRC_R --> 354bf215546Sopenharmony_ci <pattern pos="49">0</pattern> <!-- DST_REL --> 355bf215546Sopenharmony_ci <pattern low="53" high="54">00</pattern> 356bf215546Sopenharmony_ci <pattern low="57" high="58">10</pattern> <!-- OPC --> 357bf215546Sopenharmony_ci 358bf215546Sopenharmony_ci <encode> 359bf215546Sopenharmony_ci <map name="DST0">src->dsts[0]</map> 360bf215546Sopenharmony_ci </encode> 361bf215546Sopenharmony_ci</bitset> 362bf215546Sopenharmony_ci 363bf215546Sopenharmony_ci<bitset name="swz" extends="#instruction-cat1-multi"> 364bf215546Sopenharmony_ci <doc> 365bf215546Sopenharmony_ci SWiZzle. Move SRC0 to DST0 and SRC1 to DST1 in parallel. In 366bf215546Sopenharmony_ci particular this can be used to swap two registers. 367bf215546Sopenharmony_ci </doc> 368bf215546Sopenharmony_ci <display> 369bf215546Sopenharmony_ci {SY}{SS}{JP}{UL}swz.{SRC_TYPE}{DST_TYPE} {ROUND}{DST0}, {DST1}, {SRC0}, {SRC1} 370bf215546Sopenharmony_ci </display> 371bf215546Sopenharmony_ci <field name="SRC1" low="8" high="15" type="#cat1-multi-src"> 372bf215546Sopenharmony_ci <param name="HALF"/> 373bf215546Sopenharmony_ci </field> 374bf215546Sopenharmony_ci <field name="DST1" low="16" high="23" type="#cat1-multi-dst"> 375bf215546Sopenharmony_ci <param name="DST_HALF"/> 376bf215546Sopenharmony_ci </field> 377bf215546Sopenharmony_ci <pattern low="24" high="31">00000000</pattern> 378bf215546Sopenharmony_ci 379bf215546Sopenharmony_ci <pattern low="40" high="41">00</pattern> <!-- SUB_OPC --> 380bf215546Sopenharmony_ci 381bf215546Sopenharmony_ci <encode> 382bf215546Sopenharmony_ci <map name="SRC0">src->srcs[0]</map> 383bf215546Sopenharmony_ci <map name="SRC1">src->srcs[1]</map> 384bf215546Sopenharmony_ci <map name="DST1">src->dsts[1]</map> 385bf215546Sopenharmony_ci </encode> 386bf215546Sopenharmony_ci</bitset> 387bf215546Sopenharmony_ci 388bf215546Sopenharmony_ci<bitset name="gat" extends="#instruction-cat1-multi"> 389bf215546Sopenharmony_ci <doc> 390bf215546Sopenharmony_ci GATher. Move SRC0 to DST0, SRC1 to DST0 + 1, SRC2 to DST0 + 2, and SRC3 to DST0 + 3. 391bf215546Sopenharmony_ci </doc> 392bf215546Sopenharmony_ci <display> 393bf215546Sopenharmony_ci {SY}{SS}{JP}{UL}gat.{SRC_TYPE}{DST_TYPE} {ROUND}{DST0}, {SRC0}, {SRC1}, {SRC2}, {SRC3} 394bf215546Sopenharmony_ci </display> 395bf215546Sopenharmony_ci <field name="SRC1" low="8" high="15" type="#cat1-multi-src"> 396bf215546Sopenharmony_ci <param name="HALF"/> 397bf215546Sopenharmony_ci </field> 398bf215546Sopenharmony_ci <field name="SRC2" low="16" high="23" type="#cat1-multi-src"> 399bf215546Sopenharmony_ci <param name="HALF"/> 400bf215546Sopenharmony_ci </field> 401bf215546Sopenharmony_ci <field name="SRC3" low="24" high="31" type="#cat1-multi-src"> 402bf215546Sopenharmony_ci <param name="HALF"/> 403bf215546Sopenharmony_ci </field> 404bf215546Sopenharmony_ci <pattern low="40" high="41">01</pattern> <!-- SUB_OPC --> 405bf215546Sopenharmony_ci 406bf215546Sopenharmony_ci <encode> 407bf215546Sopenharmony_ci <map name="SRC0">src->srcs[0]</map> 408bf215546Sopenharmony_ci <map name="SRC1">src->srcs[1]</map> 409bf215546Sopenharmony_ci <map name="SRC2">src->srcs[2]</map> 410bf215546Sopenharmony_ci <map name="SRC3">src->srcs[3]</map> 411bf215546Sopenharmony_ci </encode> 412bf215546Sopenharmony_ci</bitset> 413bf215546Sopenharmony_ci 414bf215546Sopenharmony_ci<bitset name="sct" extends="#instruction-cat1-multi"> 415bf215546Sopenharmony_ci <doc> 416bf215546Sopenharmony_ci SCaTter. Move SRC0 to DST0, SRC0 + 1 to DST1, SRC0 + 2 to DST2 + 3, and SRC0 + 3 to DST3. 417bf215546Sopenharmony_ci </doc> 418bf215546Sopenharmony_ci <display> 419bf215546Sopenharmony_ci {SY}{SS}{JP}{UL}sct.{SRC_TYPE}{DST_TYPE} {ROUND}{DST0}, {DST1}, {DST2}, {DST3}, {SRC0} 420bf215546Sopenharmony_ci </display> 421bf215546Sopenharmony_ci <field name="DST1" low="8" high="15" type="#cat1-multi-dst"> 422bf215546Sopenharmony_ci <param name="DST_HALF"/> 423bf215546Sopenharmony_ci </field> 424bf215546Sopenharmony_ci <field name="DST2" low="16" high="23" type="#cat1-multi-dst"> 425bf215546Sopenharmony_ci <param name="DST_HALF"/> 426bf215546Sopenharmony_ci </field> 427bf215546Sopenharmony_ci <field name="DST3" low="24" high="31" type="#cat1-multi-dst"> 428bf215546Sopenharmony_ci <param name="DST_HALF"/> 429bf215546Sopenharmony_ci </field> 430bf215546Sopenharmony_ci <pattern low="40" high="41">10</pattern> <!-- SUB_OPC --> 431bf215546Sopenharmony_ci 432bf215546Sopenharmony_ci <encode> 433bf215546Sopenharmony_ci <map name="SRC0">src->srcs[0]</map> 434bf215546Sopenharmony_ci <map name="DST1">src->dsts[1]</map> 435bf215546Sopenharmony_ci <map name="DST2">src->dsts[2]</map> 436bf215546Sopenharmony_ci <map name="DST3">src->dsts[3]</map> 437bf215546Sopenharmony_ci </encode> 438bf215546Sopenharmony_ci</bitset> 439bf215546Sopenharmony_ci 440bf215546Sopenharmony_ci<bitset name="movmsk" extends="#instruction-cat1"> 441bf215546Sopenharmony_ci <display> 442bf215546Sopenharmony_ci {SY}{SS}{JP}{UL}movmsk.w{W} {DST} 443bf215546Sopenharmony_ci </display> 444bf215546Sopenharmony_ci <derived name="W" type="uint"> 445bf215546Sopenharmony_ci <expr> 446bf215546Sopenharmony_ci ({REPEAT} + 1) * 32 447bf215546Sopenharmony_ci </expr> 448bf215546Sopenharmony_ci </derived> 449bf215546Sopenharmony_ci <pattern low="0" high="31">00000000000000000000000000000000</pattern> 450bf215546Sopenharmony_ci <field name="DST" low="32" high="39" type="#cat1-dst"> 451bf215546Sopenharmony_ci <param name="DST_REL"/> 452bf215546Sopenharmony_ci </field> 453bf215546Sopenharmony_ci <field name="REPEAT" low="40" high="41" type="#rptN"/> 454bf215546Sopenharmony_ci <pattern pos="43">0</pattern> <!-- SRC_R --> 455bf215546Sopenharmony_ci <pattern low="46" high="48">011</pattern> <!-- DST_TYPE==u32 --> 456bf215546Sopenharmony_ci <field name="DST_REL" pos="49" type="bool"/> 457bf215546Sopenharmony_ci <pattern low="50" high="52">011</pattern> <!-- SRC_TYPE==u32 --> 458bf215546Sopenharmony_ci <pattern low="53" high="54">00</pattern> 459bf215546Sopenharmony_ci <pattern low="57" high="58">11</pattern> <!-- OPC --> 460bf215546Sopenharmony_ci</bitset> 461bf215546Sopenharmony_ci 462bf215546Sopenharmony_ci 463bf215546Sopenharmony_ci</isa> 464