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) &amp;&amp; {DST_REL}
38bf215546Sopenharmony_ci		</expr>
39bf215546Sopenharmony_ci		<display>
40bf215546Sopenharmony_ci			r&lt;a0.x&gt;
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&lt;a0.x + {OFFSET}&gt;
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 &amp; IR3_REG_R)</map>
81bf215546Sopenharmony_ci		<map name="UL">!!(src->flags &amp; IR3_INSTR_UL)</map>
82bf215546Sopenharmony_ci		<map name="DST_REL">!!(src->dsts[0]->flags &amp; 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 */) &amp;&amp; ({SRC_TYPE} == 4 /* s16 */) &amp;&amp; ({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 */) &amp;&amp; ({SRC_TYPE} == 2 /* u16 */) &amp;&amp; ({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 */) &amp;&amp; ({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