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
28Q6INSN(C2_cmpeq,"Pd4=cmp.eq(Rs32,Rt32)",ATTRIBS(),
29"Compare for Equal",
30{PdV=f8BITSOF(RsV==RtV);})
31
32Q6INSN(C2_cmpgt,"Pd4=cmp.gt(Rs32,Rt32)",ATTRIBS(),
33"Compare for signed Greater Than",
34{PdV=f8BITSOF(RsV>RtV);})
35
36Q6INSN(C2_cmpgtu,"Pd4=cmp.gtu(Rs32,Rt32)",ATTRIBS(),
37"Compare for Greater Than Unsigned",
38{PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(RtV));})
39
40Q6INSN(C2_cmpeqp,"Pd4=cmp.eq(Rss32,Rtt32)",ATTRIBS(),
41"Compare for Equal",
42{PdV=f8BITSOF(RssV==RttV);})
43
44Q6INSN(C2_cmpgtp,"Pd4=cmp.gt(Rss32,Rtt32)",ATTRIBS(),
45"Compare for signed Greater Than",
46{PdV=f8BITSOF(RssV>RttV);})
47
48Q6INSN(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
60Q6INSN(A4_rcmpeqi,"Rd32=cmp.eq(Rs32,#s8)",ATTRIBS(),
61"Compare for Equal",
62{fIMMEXT(siV); RdV=(RsV==siV); })
63
64Q6INSN(A4_rcmpneqi,"Rd32=!cmp.eq(Rs32,#s8)",ATTRIBS(),
65"Compare for Equal",
66{fIMMEXT(siV); RdV=(RsV!=siV); })
67
68
69Q6INSN(A4_rcmpeq,"Rd32=cmp.eq(Rs32,Rt32)",ATTRIBS(),
70"Compare for Equal",
71{RdV=(RsV==RtV); })
72
73Q6INSN(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
84Q6INSN(C2_bitsset,"Pd4=bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
85"Compare for selected bits set",
86{PdV=f8BITSOF((RsV&RtV)==RtV);})
87
88Q6INSN(C2_bitsclr,"Pd4=bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
89"Compare for selected bits clear",
90{PdV=f8BITSOF((RsV&RtV)==0);})
91
92
93Q6INSN(C4_nbitsset,"Pd4=!bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
94"Compare for selected bits set",
95{PdV=f8BITSOF((RsV&RtV)!=RtV);})
96
97Q6INSN(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
107Q6INSN(C2_cmpeqi,"Pd4=cmp.eq(Rs32,#s10)",ATTRIBS(),
108"Compare for Equal",
109{fIMMEXT(siV); PdV=f8BITSOF(RsV==siV);})
110
111Q6INSN(C2_cmpgti,"Pd4=cmp.gt(Rs32,#s10)",ATTRIBS(),
112"Compare for signed Greater Than",
113{fIMMEXT(siV); PdV=f8BITSOF(RsV>siV);})
114
115Q6INSN(C2_cmpgtui,"Pd4=cmp.gtu(Rs32,#u9)",ATTRIBS(),
116"Compare for Greater Than Unsigned",
117{fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(uiV));})
118
119Q6INSN(C2_bitsclri,"Pd4=bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
120"Compare for selected bits clear",
121{PdV=f8BITSOF((RsV&uiV)==0);})
122
123Q6INSN(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
130Q6INSN(C4_cmpneqi,"Pd4=!cmp.eq(Rs32,#s10)",ATTRIBS(), "Compare for Not Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV!=siV);})
131Q6INSN(C4_cmpltei,"Pd4=!cmp.gt(Rs32,#s10)",ATTRIBS(), "Compare for Less Than or Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV<=siV);})
132Q6INSN(C4_cmplteui,"Pd4=!cmp.gtu(Rs32,#u9)",ATTRIBS(), "Compare for Less Than or Equal Unsigned", {fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(uiV));})
133
134Q6INSN(C4_cmpneq,"Pd4=!cmp.eq(Rs32,Rt32)",ATTRIBS(), "And-Compare for Equal", {PdV=f8BITSOF(RsV!=RtV);})
135Q6INSN(C4_cmplte,"Pd4=!cmp.gt(Rs32,Rt32)",ATTRIBS(), "And-Compare for signed Greater Than", {PdV=f8BITSOF(RsV<=RtV);})
136Q6INSN(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
144Q6INSN(C2_and,"Pd4=and(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
145"Predicate AND",
146{PdV=PsV & PtV;})
147
148Q6INSN(C2_or,"Pd4=or(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
149"Predicate OR",
150{PdV=PsV | PtV;})
151
152Q6INSN(C2_xor,"Pd4=xor(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
153"Predicate XOR",
154{PdV=PsV ^ PtV;})
155
156Q6INSN(C2_andn,"Pd4=and(Pt4,!Ps4)",ATTRIBS(A_CRSLOT23),
157"Predicate AND NOT",
158{PdV=PtV & (~PsV);})
159
160Q6INSN(C2_not,"Pd4=not(Ps4)",ATTRIBS(A_CRSLOT23),
161"Logical NOT Predicate",
162{PdV=~PsV;})
163
164Q6INSN(C2_orn,"Pd4=or(Pt4,!Ps4)",ATTRIBS(A_ARCHV2,A_CRSLOT23),
165"Predicate OR NOT",
166{PdV=PtV | (~PsV);})
167
168
169
170
171
172Q6INSN(C4_and_and,"Pd4=and(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
173"Compound And-And", { PdV = PsV & PtV & PuV; })
174
175Q6INSN(C4_and_or,"Pd4=and(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
176"Compound And-Or", { PdV = PsV &  (PtV | PuV); })
177
178Q6INSN(C4_or_and,"Pd4=or(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
179"Compound Or-And", { PdV = PsV | (PtV & PuV); })
180
181Q6INSN(C4_or_or,"Pd4=or(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
182"Compound Or-Or", { PdV = PsV | PtV | PuV; })
183
184
185
186Q6INSN(C4_and_andn,"Pd4=and(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
187"Compound And-And", { PdV = PsV & PtV & (~PuV); })
188
189Q6INSN(C4_and_orn,"Pd4=and(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
190"Compound And-Or", { PdV = PsV &  (PtV | (~PuV)); })
191
192Q6INSN(C4_or_andn,"Pd4=or(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
193"Compound Or-And", { PdV = PsV | (PtV & (~PuV)); })
194
195Q6INSN(C4_or_orn,"Pd4=or(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
196"Compound Or-Or", { PdV = PsV | PtV | (~PuV); })
197
198
199Q6INSN(C2_any8,"Pd4=any8(Ps4)",ATTRIBS(A_CRSLOT23),
200"Logical ANY of low 8 predicate bits",
201{ PsV ? (PdV=0xff) : (PdV=0x00); })
202
203Q6INSN(C2_all8,"Pd4=all8(Ps4)",ATTRIBS(A_CRSLOT23),
204"Logical ALL of low 8 predicate bits",
205{ (PsV==0xff) ? (PdV=0xff) : (PdV=0x00); })
206
207Q6INSN(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
213Q6INSN(C2_mux,"Rd32=mux(Pu4,Rs32,Rt32)",ATTRIBS(),
214"Scalar MUX",
215{ (fLSBOLD(PuV)) ? (RdV=RsV):(RdV=RtV); })
216
217
218Q6INSN(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
222Q6INSN(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
226Q6INSN(C2_cmoveit,"if (Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2),
227"Scalar conditional move",
228{ fIMMEXT(siV); if (fLSBOLD(PuV)) RdV=siV; else CANCEL;})
229
230Q6INSN(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
236Q6INSN(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
244Q6INSN(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
252Q6INSN(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
260Q6INSN(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
270Q6INSN(C2_muxii,"Rd32=mux(Pu4,#s8,#S8)",ATTRIBS(A_ARCHV2),
271"Scalar MUX immediates",
272{ fIMMEXT(siV); (fLSBOLD(PuV)) ? (RdV=siV):(RdV=SiV); })
273
274
275
276Q6INSN(C2_muxir,"Rd32=mux(Pu4,Rs32,#s8)",ATTRIBS(A_ARCHV2),
277"Scalar MUX register immediate",
278{ fIMMEXT(siV); (fLSBOLD(PuV)) ? (RdV=RsV):(RdV=siV); })
279
280
281Q6INSN(C2_muxri,"Rd32=mux(Pu4,#s8,Rs32)",ATTRIBS(A_ARCHV2),
282"Scalar MUX register immediate",
283{ fIMMEXT(siV); (fLSBOLD(PuV)) ? (RdV=siV):(RdV=RsV); })
284
285
286
287Q6INSN(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
296Q6INSN(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
307Q6INSN(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
316Q6INSN(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
325Q6INSN(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
335Q6INSN(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
346Q6INSN(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
355Q6INSN(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
364Q6INSN(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
373Q6INSN(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
384Q6INSN(A4_cmpbeq,"Pd4=cmpb.eq(Rs32,Rt32)",ATTRIBS(),
385"Compare bytes ",
386{
387    PdV=f8BITSOF(fGETBYTE(0,RsV) == fGETBYTE(0,RtV));
388})
389
390Q6INSN(A4_cmpbeqi,"Pd4=cmpb.eq(Rs32,#u8)",ATTRIBS(),
391"Compare bytes ",
392{
393    PdV=f8BITSOF(fGETUBYTE(0,RsV) == uiV);
394})
395
396Q6INSN(A4_cmpbgtu,"Pd4=cmpb.gtu(Rs32,Rt32)",ATTRIBS(),
397"Compare bytes ",
398{
399    PdV=f8BITSOF(fGETUBYTE(0,RsV) > fGETUBYTE(0,RtV));
400})
401
402Q6INSN(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
409Q6INSN(A4_cmpbgt,"Pd4=cmpb.gt(Rs32,Rt32)",ATTRIBS(),
410"Compare bytes ",
411{
412    PdV=f8BITSOF(fGETBYTE(0,RsV) > fGETBYTE(0,RtV));
413})
414
415Q6INSN(A4_cmpbgti,"Pd4=cmpb.gt(Rs32,#s8)",ATTRIBS(),
416"Compare bytes ",
417{
418    PdV=f8BITSOF(fGETBYTE(0,RsV) > siV);
419})
420
421Q6INSN(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
431Q6INSN(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
441Q6INSN(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
451Q6INSN(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
461Q6INSN(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
472Q6INSN(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
482Q6INSN(A4_cmpheq,"Pd4=cmph.eq(Rs32,Rt32)",ATTRIBS(),
483"Compare halfwords ",
484{
485    PdV=f8BITSOF(fGETHALF(0,RsV) == fGETHALF(0,RtV));
486})
487
488Q6INSN(A4_cmphgt,"Pd4=cmph.gt(Rs32,Rt32)",ATTRIBS(),
489"Compare halfwords ",
490{
491    PdV=f8BITSOF(fGETHALF(0,RsV) > fGETHALF(0,RtV));
492})
493
494Q6INSN(A4_cmphgtu,"Pd4=cmph.gtu(Rs32,Rt32)",ATTRIBS(),
495"Compare halfwords ",
496{
497    PdV=f8BITSOF(fGETUHALF(0,RsV) > fGETUHALF(0,RtV));
498})
499
500Q6INSN(A4_cmpheqi,"Pd4=cmph.eq(Rs32,#s8)",ATTRIBS(),
501"Compare halfwords ",
502{
503    fIMMEXT(siV);
504    PdV=f8BITSOF(fGETHALF(0,RsV) == siV);
505})
506
507Q6INSN(A4_cmphgti,"Pd4=cmph.gt(Rs32,#s8)",ATTRIBS(),
508"Compare halfwords ",
509{
510    fIMMEXT(siV);
511    PdV=f8BITSOF(fGETHALF(0,RsV) > siV);
512})
513
514Q6INSN(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
521Q6INSN(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
528Q6INSN(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
535Q6INSN(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
542Q6INSN(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
549Q6INSN(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
556Q6INSN(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
563Q6INSN(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
571Q6INSN(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
579Q6INSN(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
591Q6INSN(C2_tfrpr,"Rd32=Ps4",ATTRIBS(),
592"Transfer predicate to general register", { RdV = fZXTN(8,32,PsV); })
593
594Q6INSN(C2_tfrrp,"Pd4=Rs32",ATTRIBS(),
595"Transfer general register to Predicate", { PdV = fGETUBYTE(0,RsV); })
596
597Q6INSN(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
609Q6INSN(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})
620