master
idef 619 lines 16.7 KB
Raw
1 /*
2 * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 */
17
18 /*
19 * Compare Instructions
20 */
21
22
23
24 /*********************************************/
25 /* Scalar compare instructions */
26 /*********************************************/
27
28 Q6INSN(C2_cmpeq,"Pd4=cmp.eq(Rs32,Rt32)",ATTRIBS(),
29 "Compare for Equal",
30 {PdV=f8BITSOF(RsV==RtV);})
31
32 Q6INSN(C2_cmpgt,"Pd4=cmp.gt(Rs32,Rt32)",ATTRIBS(),
33 "Compare for signed Greater Than",
34 {PdV=f8BITSOF(RsV>RtV);})
35
36 Q6INSN(C2_cmpgtu,"Pd4=cmp.gtu(Rs32,Rt32)",ATTRIBS(),
37 "Compare for Greater Than Unsigned",
38 {PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(RtV));})
39
40 Q6INSN(C2_cmpeqp,"Pd4=cmp.eq(Rss32,Rtt32)",ATTRIBS(),
41 "Compare for Equal",
42 {PdV=f8BITSOF(RssV==RttV);})
43
44 Q6INSN(C2_cmpgtp,"Pd4=cmp.gt(Rss32,Rtt32)",ATTRIBS(),
45 "Compare for signed Greater Than",
46 {PdV=f8BITSOF(RssV>RttV);})
47
48 Q6INSN(C2_cmpgtup,"Pd4=cmp.gtu(Rss32,Rtt32)",ATTRIBS(),
49 "Compare for Greater Than Unsigned",
50 {PdV=f8BITSOF(fCAST8u(RssV)>fCAST8u(RttV));})
51
52
53
54
55 /*********************************************/
56 /* Compare and put result in GPR */
57 /* typically for function I/O */
58 /*********************************************/
59
60 Q6INSN(A4_rcmpeqi,"Rd32=cmp.eq(Rs32,#s8)",ATTRIBS(),
61 "Compare for Equal",
62 {fIMMEXT(siV); RdV=(RsV==siV); })
63
64 Q6INSN(A4_rcmpneqi,"Rd32=!cmp.eq(Rs32,#s8)",ATTRIBS(),
65 "Compare for Equal",
66 {fIMMEXT(siV); RdV=(RsV!=siV); })
67
68
69 Q6INSN(A4_rcmpeq,"Rd32=cmp.eq(Rs32,Rt32)",ATTRIBS(),
70 "Compare for Equal",
71 {RdV=(RsV==RtV); })
72
73 Q6INSN(A4_rcmpneq,"Rd32=!cmp.eq(Rs32,Rt32)",ATTRIBS(),
74 "Compare for Equal",
75 {RdV=(RsV!=RtV); })
76
77
78
79 /*********************************************/
80 /* Scalar compare instructions */
81 /*********************************************/
82
83
84 Q6INSN(C2_bitsset,"Pd4=bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
85 "Compare for selected bits set",
86 {PdV=f8BITSOF((RsV&RtV)==RtV);})
87
88 Q6INSN(C2_bitsclr,"Pd4=bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
89 "Compare for selected bits clear",
90 {PdV=f8BITSOF((RsV&RtV)==0);})
91
92
93 Q6INSN(C4_nbitsset,"Pd4=!bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
94 "Compare for selected bits set",
95 {PdV=f8BITSOF((RsV&RtV)!=RtV);})
96
97 Q6INSN(C4_nbitsclr,"Pd4=!bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
98 "Compare for selected bits clear",
99 {PdV=f8BITSOF((RsV&RtV)!=0);})
100
101
102
103 /*********************************************/
104 /* Scalar compare instructions W/ immediate */
105 /*********************************************/
106
107 Q6INSN(C2_cmpeqi,"Pd4=cmp.eq(Rs32,#s10)",ATTRIBS(),
108 "Compare for Equal",
109 {fIMMEXT(siV); PdV=f8BITSOF(RsV==siV);})
110
111 Q6INSN(C2_cmpgti,"Pd4=cmp.gt(Rs32,#s10)",ATTRIBS(),
112 "Compare for signed Greater Than",
113 {fIMMEXT(siV); PdV=f8BITSOF(RsV>siV);})
114
115 Q6INSN(C2_cmpgtui,"Pd4=cmp.gtu(Rs32,#u9)",ATTRIBS(),
116 "Compare for Greater Than Unsigned",
117 {fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(uiV));})
118
119 Q6INSN(C2_bitsclri,"Pd4=bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
120 "Compare for selected bits clear",
121 {PdV=f8BITSOF((RsV&uiV)==0);})
122
123 Q6INSN(C4_nbitsclri,"Pd4=!bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
124 "Compare for selected bits clear",
125 {PdV=f8BITSOF((RsV&uiV)!=0);})
126
127
128
129
130 Q6INSN(C4_cmpneqi,"Pd4=!cmp.eq(Rs32,#s10)",ATTRIBS(), "Compare for Not Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV!=siV);})
131 Q6INSN(C4_cmpltei,"Pd4=!cmp.gt(Rs32,#s10)",ATTRIBS(), "Compare for Less Than or Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV<=siV);})
132 Q6INSN(C4_cmplteui,"Pd4=!cmp.gtu(Rs32,#u9)",ATTRIBS(), "Compare for Less Than or Equal Unsigned", {fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(uiV));})
133
134 Q6INSN(C4_cmpneq,"Pd4=!cmp.eq(Rs32,Rt32)",ATTRIBS(), "And-Compare for Equal", {PdV=f8BITSOF(RsV!=RtV);})
135 Q6INSN(C4_cmplte,"Pd4=!cmp.gt(Rs32,Rt32)",ATTRIBS(), "And-Compare for signed Greater Than", {PdV=f8BITSOF(RsV<=RtV);})
136 Q6INSN(C4_cmplteu,"Pd4=!cmp.gtu(Rs32,Rt32)",ATTRIBS(), "And-Compare for Greater Than Unsigned", {PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(RtV));})
137
138
139
140
141
142 /* Predicate Logical Operations */
143
144 Q6INSN(C2_and,"Pd4=and(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
145 "Predicate AND",
146 {PdV=PsV & PtV;})
147
148 Q6INSN(C2_or,"Pd4=or(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
149 "Predicate OR",
150 {PdV=PsV | PtV;})
151
152 Q6INSN(C2_xor,"Pd4=xor(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
153 "Predicate XOR",
154 {PdV=PsV ^ PtV;})
155
156 Q6INSN(C2_andn,"Pd4=and(Pt4,!Ps4)",ATTRIBS(A_CRSLOT23),
157 "Predicate AND NOT",
158 {PdV=PtV & (~PsV);})
159
160 Q6INSN(C2_not,"Pd4=not(Ps4)",ATTRIBS(A_CRSLOT23),
161 "Logical NOT Predicate",
162 {PdV=~PsV;})
163
164 Q6INSN(C2_orn,"Pd4=or(Pt4,!Ps4)",ATTRIBS(A_ARCHV2,A_CRSLOT23),
165 "Predicate OR NOT",
166 {PdV=PtV | (~PsV);})
167
168
169
170
171
172 Q6INSN(C4_and_and,"Pd4=and(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
173 "Compound And-And", { PdV = PsV & PtV & PuV; })
174
175 Q6INSN(C4_and_or,"Pd4=and(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
176 "Compound And-Or", { PdV = PsV & (PtV | PuV); })
177
178 Q6INSN(C4_or_and,"Pd4=or(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
179 "Compound Or-And", { PdV = PsV | (PtV & PuV); })
180
181 Q6INSN(C4_or_or,"Pd4=or(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
182 "Compound Or-Or", { PdV = PsV | PtV | PuV; })
183
184
185
186 Q6INSN(C4_and_andn,"Pd4=and(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
187 "Compound And-And", { PdV = PsV & PtV & (~PuV); })
188
189 Q6INSN(C4_and_orn,"Pd4=and(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
190 "Compound And-Or", { PdV = PsV & (PtV | (~PuV)); })
191
192 Q6INSN(C4_or_andn,"Pd4=or(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
193 "Compound Or-And", { PdV = PsV | (PtV & (~PuV)); })
194
195 Q6INSN(C4_or_orn,"Pd4=or(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
196 "Compound Or-Or", { PdV = PsV | PtV | (~PuV); })
197
198
199 Q6INSN(C2_any8,"Pd4=any8(Ps4)",ATTRIBS(A_CRSLOT23),
200 "Logical ANY of low 8 predicate bits",
201 { PdV = (PsV ? 0xff : 0x00); })
202
203 Q6INSN(C2_all8,"Pd4=all8(Ps4)",ATTRIBS(A_CRSLOT23),
204 "Logical ALL of low 8 predicate bits",
205 { PdV = (PsV == 0xff ? 0xff : 0x00); })
206
207 Q6INSN(C2_vitpack,"Rd32=vitpack(Ps4,Pt4)",ATTRIBS(),
208 "Pack the odd and even bits of two predicate registers",
209 { RdV = (PsV&0x55) | (PtV&0xAA); })
210
211 /* Mux instructions */
212
213 Q6INSN(C2_mux,"Rd32=mux(Pu4,Rs32,Rt32)",ATTRIBS(),
214 "Scalar MUX",
215 { RdV = (fLSBOLD(PuV) ? RsV : RtV); })
216
217
218 Q6INSN(C2_cmovenewit,"if (Pu4.new) Rd32=#s12",ATTRIBS(A_ARCHV2),
219 "Scalar conditional move",
220 { fIMMEXT(siV); if (fLSBNEW(PuN)) RdV=siV; else CANCEL;})
221
222 Q6INSN(C2_cmovenewif,"if (!Pu4.new) Rd32=#s12",ATTRIBS(A_ARCHV2),
223 "Scalar conditional move",
224 { fIMMEXT(siV); if (fLSBNEWNOT(PuN)) RdV=siV; else CANCEL;})
225
226 Q6INSN(C2_cmoveit,"if (Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2),
227 "Scalar conditional move",
228 { fIMMEXT(siV); if (fLSBOLD(PuV)) RdV=siV; else CANCEL;})
229
230 Q6INSN(C2_cmoveif,"if (!Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2),
231 "Scalar conditional move",
232 { fIMMEXT(siV); if (fLSBOLDNOT(PuV)) RdV=siV; else CANCEL;})
233
234
235
236 Q6INSN(C2_ccombinewnewt,"if (Pu4.new) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
237 "Conditionally combine two words into a register pair",
238 { if (fLSBNEW(PuN)) {
239 fSETWORD(0,RddV,RtV);
240 fSETWORD(1,RddV,RsV);
241 } else {CANCEL;}
242 })
243
244 Q6INSN(C2_ccombinewnewf,"if (!Pu4.new) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
245 "Conditionally combine two words into a register pair",
246 { if (fLSBNEWNOT(PuN)) {
247 fSETWORD(0,RddV,RtV);
248 fSETWORD(1,RddV,RsV);
249 } else {CANCEL;}
250 })
251
252 Q6INSN(C2_ccombinewt,"if (Pu4) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
253 "Conditionally combine two words into a register pair",
254 { if (fLSBOLD(PuV)) {
255 fSETWORD(0,RddV,RtV);
256 fSETWORD(1,RddV,RsV);
257 } else {CANCEL;}
258 })
259
260 Q6INSN(C2_ccombinewf,"if (!Pu4) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
261 "Conditionally combine two words into a register pair",
262 { if (fLSBOLDNOT(PuV)) {
263 fSETWORD(0,RddV,RtV);
264 fSETWORD(1,RddV,RsV);
265 } else {CANCEL;}
266 })
267
268
269
270 Q6INSN(C2_muxii,"Rd32=mux(Pu4,#s8,#S8)",ATTRIBS(A_ARCHV2),
271 "Scalar MUX immediates",
272 { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : SiV); })
273
274
275
276 Q6INSN(C2_muxir,"Rd32=mux(Pu4,Rs32,#s8)",ATTRIBS(A_ARCHV2),
277 "Scalar MUX register immediate",
278 { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? RsV : siV); })
279
280
281 Q6INSN(C2_muxri,"Rd32=mux(Pu4,#s8,Rs32)",ATTRIBS(A_ARCHV2),
282 "Scalar MUX register immediate",
283 { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : RsV); })
284
285
286
287 Q6INSN(C2_vmux,"Rdd32=vmux(Pu4,Rss32,Rtt32)",ATTRIBS(),
288 "Vector MUX",
289 {
290 fHIDE(int i;)
291 for (i = 0; i < 8; i++) {
292 fSETBYTE(i,RddV,(fGETBIT(i,PuV)?(fGETBYTE(i,RssV)):(fGETBYTE(i,RttV))));
293 }
294 })
295
296 Q6INSN(C2_mask,"Rdd32=mask(Pt4)",ATTRIBS(),
297 "Vector Mask Generation",
298 {
299 fHIDE(int i;)
300 for (i = 0; i < 8; i++) {
301 fSETBYTE(i,RddV,(fGETBIT(i,PtV)?(0xff):(0x00)));
302 }
303 })
304
305 /* VCMP */
306
307 Q6INSN(A2_vcmpbeq,"Pd4=vcmpb.eq(Rss32,Rtt32)",ATTRIBS(),
308 "Compare elements of two vectors ",
309 {
310 fHIDE(int i;)
311 for (i = 0; i < 8; i++) {
312 fSETBIT(i,PdV,(fGETBYTE(i,RssV) == fGETBYTE(i,RttV)));
313 }
314 })
315
316 Q6INSN(A4_vcmpbeqi,"Pd4=vcmpb.eq(Rss32,#u8)",ATTRIBS(),
317 "Compare elements of two vectors ",
318 {
319 fHIDE(int i;)
320 for (i = 0; i < 8; i++) {
321 fSETBIT(i,PdV,(fGETUBYTE(i,RssV) == uiV));
322 }
323 })
324
325 Q6INSN(A4_vcmpbeq_any,"Pd4=any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(),
326 "Compare elements of two vectors ",
327 {
328 fHIDE(int i;)
329 PdV = 0;
330 for (i = 0; i < 8; i++) {
331 if (fGETBYTE(i,RssV) == fGETBYTE(i,RttV)) PdV = 0xff;
332 }
333 })
334
335 Q6INSN(A6_vcmpbeq_notany,"Pd4=!any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(),
336 "Compare elements of two vectors ",
337 {
338 fHIDE(int i;)
339 PdV = 0;
340 for (i = 0; i < 8; i++) {
341 if (fGETBYTE(i,RssV) == fGETBYTE(i,RttV)) PdV = 0xff;
342 }
343 PdV = ~PdV;
344 })
345
346 Q6INSN(A2_vcmpbgtu,"Pd4=vcmpb.gtu(Rss32,Rtt32)",ATTRIBS(),
347 "Compare elements of two vectors ",
348 {
349 fHIDE(int i;)
350 for (i = 0; i < 8; i++) {
351 fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > fGETUBYTE(i,RttV)));
352 }
353 })
354
355 Q6INSN(A4_vcmpbgtui,"Pd4=vcmpb.gtu(Rss32,#u7)",ATTRIBS(),
356 "Compare elements of two vectors ",
357 {
358 fHIDE(int i;)
359 for (i = 0; i < 8; i++) {
360 fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > uiV));
361 }
362 })
363
364 Q6INSN(A4_vcmpbgt,"Pd4=vcmpb.gt(Rss32,Rtt32)",ATTRIBS(),
365 "Compare elements of two vectors ",
366 {
367 fHIDE(int i;)
368 for (i = 0; i < 8; i++) {
369 fSETBIT(i,PdV,(fGETBYTE(i,RssV) > fGETBYTE(i,RttV)));
370 }
371 })
372
373 Q6INSN(A4_vcmpbgti,"Pd4=vcmpb.gt(Rss32,#s8)",ATTRIBS(),
374 "Compare elements of two vectors ",
375 {
376 fHIDE(int i;)
377 for (i = 0; i < 8; i++) {
378 fSETBIT(i,PdV,(fGETBYTE(i,RssV) > siV));
379 }
380 })
381
382
383
384 Q6INSN(A4_cmpbeq,"Pd4=cmpb.eq(Rs32,Rt32)",ATTRIBS(),
385 "Compare bytes ",
386 {
387 PdV=f8BITSOF(fGETBYTE(0,RsV) == fGETBYTE(0,RtV));
388 })
389
390 Q6INSN(A4_cmpbeqi,"Pd4=cmpb.eq(Rs32,#u8)",ATTRIBS(),
391 "Compare bytes ",
392 {
393 PdV=f8BITSOF(fGETUBYTE(0,RsV) == uiV);
394 })
395
396 Q6INSN(A4_cmpbgtu,"Pd4=cmpb.gtu(Rs32,Rt32)",ATTRIBS(),
397 "Compare bytes ",
398 {
399 PdV=f8BITSOF(fGETUBYTE(0,RsV) > fGETUBYTE(0,RtV));
400 })
401
402 Q6INSN(A4_cmpbgtui,"Pd4=cmpb.gtu(Rs32,#u7)",ATTRIBS(),
403 "Compare bytes ",
404 {
405 fIMMEXT(uiV);
406 PdV=f8BITSOF(fGETUBYTE(0,RsV) > fCAST4u(uiV));
407 })
408
409 Q6INSN(A4_cmpbgt,"Pd4=cmpb.gt(Rs32,Rt32)",ATTRIBS(),
410 "Compare bytes ",
411 {
412 PdV=f8BITSOF(fGETBYTE(0,RsV) > fGETBYTE(0,RtV));
413 })
414
415 Q6INSN(A4_cmpbgti,"Pd4=cmpb.gt(Rs32,#s8)",ATTRIBS(),
416 "Compare bytes ",
417 {
418 PdV=f8BITSOF(fGETBYTE(0,RsV) > siV);
419 })
420
421 Q6INSN(A2_vcmpheq,"Pd4=vcmph.eq(Rss32,Rtt32)",ATTRIBS(),
422 "Compare elements of two vectors ",
423 {
424 fHIDE(int i;)
425 for (i = 0; i < 4; i++) {
426 fSETBIT(i*2,PdV, (fGETHALF(i,RssV) == fGETHALF(i,RttV)));
427 fSETBIT(i*2+1,PdV,(fGETHALF(i,RssV) == fGETHALF(i,RttV)));
428 }
429 })
430
431 Q6INSN(A2_vcmphgt,"Pd4=vcmph.gt(Rss32,Rtt32)",ATTRIBS(),
432 "Compare elements of two vectors ",
433 {
434 fHIDE(int i;)
435 for (i = 0; i < 4; i++) {
436 fSETBIT(i*2, PdV, (fGETHALF(i,RssV) > fGETHALF(i,RttV)));
437 fSETBIT(i*2+1,PdV, (fGETHALF(i,RssV) > fGETHALF(i,RttV)));
438 }
439 })
440
441 Q6INSN(A2_vcmphgtu,"Pd4=vcmph.gtu(Rss32,Rtt32)",ATTRIBS(),
442 "Compare elements of two vectors ",
443 {
444 fHIDE(int i;)
445 for (i = 0; i < 4; i++) {
446 fSETBIT(i*2, PdV, (fGETUHALF(i,RssV) > fGETUHALF(i,RttV)));
447 fSETBIT(i*2+1,PdV, (fGETUHALF(i,RssV) > fGETUHALF(i,RttV)));
448 }
449 })
450
451 Q6INSN(A4_vcmpheqi,"Pd4=vcmph.eq(Rss32,#s8)",ATTRIBS(),
452 "Compare elements of two vectors ",
453 {
454 fHIDE(int i;)
455 for (i = 0; i < 4; i++) {
456 fSETBIT(i*2,PdV, (fGETHALF(i,RssV) == siV));
457 fSETBIT(i*2+1,PdV,(fGETHALF(i,RssV) == siV));
458 }
459 })
460
461 Q6INSN(A4_vcmphgti,"Pd4=vcmph.gt(Rss32,#s8)",ATTRIBS(),
462 "Compare elements of two vectors ",
463 {
464 fHIDE(int i;)
465 for (i = 0; i < 4; i++) {
466 fSETBIT(i*2, PdV, (fGETHALF(i,RssV) > siV));
467 fSETBIT(i*2+1,PdV, (fGETHALF(i,RssV) > siV));
468 }
469 })
470
471
472 Q6INSN(A4_vcmphgtui,"Pd4=vcmph.gtu(Rss32,#u7)",ATTRIBS(),
473 "Compare elements of two vectors ",
474 {
475 fHIDE(int i;)
476 for (i = 0; i < 4; i++) {
477 fSETBIT(i*2, PdV, (fGETUHALF(i,RssV) > uiV));
478 fSETBIT(i*2+1,PdV, (fGETUHALF(i,RssV) > uiV));
479 }
480 })
481
482 Q6INSN(A4_cmpheq,"Pd4=cmph.eq(Rs32,Rt32)",ATTRIBS(),
483 "Compare halfwords ",
484 {
485 PdV=f8BITSOF(fGETHALF(0,RsV) == fGETHALF(0,RtV));
486 })
487
488 Q6INSN(A4_cmphgt,"Pd4=cmph.gt(Rs32,Rt32)",ATTRIBS(),
489 "Compare halfwords ",
490 {
491 PdV=f8BITSOF(fGETHALF(0,RsV) > fGETHALF(0,RtV));
492 })
493
494 Q6INSN(A4_cmphgtu,"Pd4=cmph.gtu(Rs32,Rt32)",ATTRIBS(),
495 "Compare halfwords ",
496 {
497 PdV=f8BITSOF(fGETUHALF(0,RsV) > fGETUHALF(0,RtV));
498 })
499
500 Q6INSN(A4_cmpheqi,"Pd4=cmph.eq(Rs32,#s8)",ATTRIBS(),
501 "Compare halfwords ",
502 {
503 fIMMEXT(siV);
504 PdV=f8BITSOF(fGETHALF(0,RsV) == siV);
505 })
506
507 Q6INSN(A4_cmphgti,"Pd4=cmph.gt(Rs32,#s8)",ATTRIBS(),
508 "Compare halfwords ",
509 {
510 fIMMEXT(siV);
511 PdV=f8BITSOF(fGETHALF(0,RsV) > siV);
512 })
513
514 Q6INSN(A4_cmphgtui,"Pd4=cmph.gtu(Rs32,#u7)",ATTRIBS(),
515 "Compare halfwords ",
516 {
517 fIMMEXT(uiV);
518 PdV=f8BITSOF(fGETUHALF(0,RsV) > fCAST4u(uiV));
519 })
520
521 Q6INSN(A2_vcmpweq,"Pd4=vcmpw.eq(Rss32,Rtt32)",ATTRIBS(),
522 "Compare elements of two vectors ",
523 {
524 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==fGETWORD(0,RttV)));
525 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==fGETWORD(1,RttV)));
526 })
527
528 Q6INSN(A2_vcmpwgt,"Pd4=vcmpw.gt(Rss32,Rtt32)",ATTRIBS(),
529 "Compare elements of two vectors ",
530 {
531 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>fGETWORD(0,RttV)));
532 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>fGETWORD(1,RttV)));
533 })
534
535 Q6INSN(A2_vcmpwgtu,"Pd4=vcmpw.gtu(Rss32,Rtt32)",ATTRIBS(),
536 "Compare elements of two vectors ",
537 {
538 fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fGETUWORD(0,RttV)));
539 fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fGETUWORD(1,RttV)));
540 })
541
542 Q6INSN(A4_vcmpweqi,"Pd4=vcmpw.eq(Rss32,#s8)",ATTRIBS(),
543 "Compare elements of two vectors ",
544 {
545 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==siV));
546 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==siV));
547 })
548
549 Q6INSN(A4_vcmpwgti,"Pd4=vcmpw.gt(Rss32,#s8)",ATTRIBS(),
550 "Compare elements of two vectors ",
551 {
552 fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>siV));
553 fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>siV));
554 })
555
556 Q6INSN(A4_vcmpwgtui,"Pd4=vcmpw.gtu(Rss32,#u7)",ATTRIBS(),
557 "Compare elements of two vectors ",
558 {
559 fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fCAST4u(uiV)));
560 fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fCAST4u(uiV)));
561 })
562
563 Q6INSN(A4_boundscheck_hi,"Pd4=boundscheck(Rss32,Rtt32):raw:hi",ATTRIBS(),
564 "Detect if a register is within bounds",
565 {
566 fHIDE(size4u_t src;)
567 src = fGETUWORD(1,RssV);
568 PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV)));
569 })
570
571 Q6INSN(A4_boundscheck_lo,"Pd4=boundscheck(Rss32,Rtt32):raw:lo",ATTRIBS(),
572 "Detect if a register is within bounds",
573 {
574 fHIDE(size4u_t src;)
575 src = fGETUWORD(0,RssV);
576 PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV)));
577 })
578
579 Q6INSN(A4_tlbmatch,"Pd4=tlbmatch(Rss32,Rt32)",ATTRIBS(),
580 "Detect if a VA/ASID matches a TLB entry",
581 {
582 fHIDE(size4u_t TLBHI; size4u_t TLBLO; size4u_t MASK; size4u_t SIZE;)
583 MASK = 0x07ffffff;
584 TLBLO = fGETUWORD(0,RssV);
585 TLBHI = fGETUWORD(1,RssV);
586 SIZE = fMIN(6,fCL1_4(~fBREV_4(TLBLO)));
587 MASK &= (0xffffffff << 2*SIZE);
588 PdV = f8BITSOF(fGETBIT(31,TLBHI) && ((TLBHI & MASK) == (RtV & MASK)));
589 })
590
591 Q6INSN(C2_tfrpr,"Rd32=Ps4",ATTRIBS(),
592 "Transfer predicate to general register", { RdV = fZXTN(8,32,PsV); })
593
594 Q6INSN(C2_tfrrp,"Pd4=Rs32",ATTRIBS(),
595 "Transfer general register to Predicate", { PdV = fGETUBYTE(0,RsV); })
596
597 Q6INSN(C4_fastcorner9,"Pd4=fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
598 "Determine whether the predicate sources define a corner",
599 {
600 fHIDE(size4u_t tmp = 0; size4u_t i;)
601 fSETHALF(0,tmp,(PsV<<8)|PtV);
602 fSETHALF(1,tmp,(PsV<<8)|PtV);
603 for (i = 1; i < 9; i++) {
604 tmp &= tmp >> 1;
605 }
606 PdV = f8BITSOF(tmp != 0);
607 })
608
609 Q6INSN(C4_fastcorner9_not,"Pd4=!fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
610 "Determine whether the predicate sources define a corner",
611 {
612 fHIDE(size4u_t tmp = 0; size4u_t i;)
613 fSETHALF(0,tmp,(PsV<<8)|PtV);
614 fSETHALF(1,tmp,(PsV<<8)|PtV);
615 for (i = 1; i < 9; i++) {
616 tmp &= tmp >> 1;
617 }
618 PdV = f8BITSOF(tmp == 0);
619 })