target/ppc: Remove last user of .load_state_old
[qemu.git] / target / hexagon / imported / compare.idef
blobabd016ffb5097fc523d86e738929e609c3cdd377
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  */
19  * Compare Instructions
20  */
24 /*********************************************/
25 /* Scalar compare instructions               */
26 /*********************************************/
28 Q6INSN(C2_cmpeq,"Pd4=cmp.eq(Rs32,Rt32)",ATTRIBS(),
29 "Compare for Equal",
30 {PdV=f8BITSOF(RsV==RtV);})
32 Q6INSN(C2_cmpgt,"Pd4=cmp.gt(Rs32,Rt32)",ATTRIBS(),
33 "Compare for signed Greater Than",
34 {PdV=f8BITSOF(RsV>RtV);})
36 Q6INSN(C2_cmpgtu,"Pd4=cmp.gtu(Rs32,Rt32)",ATTRIBS(),
37 "Compare for Greater Than Unsigned",
38 {PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(RtV));})
40 Q6INSN(C2_cmpeqp,"Pd4=cmp.eq(Rss32,Rtt32)",ATTRIBS(),
41 "Compare for Equal",
42 {PdV=f8BITSOF(RssV==RttV);})
44 Q6INSN(C2_cmpgtp,"Pd4=cmp.gt(Rss32,Rtt32)",ATTRIBS(),
45 "Compare for signed Greater Than",
46 {PdV=f8BITSOF(RssV>RttV);})
48 Q6INSN(C2_cmpgtup,"Pd4=cmp.gtu(Rss32,Rtt32)",ATTRIBS(),
49 "Compare for Greater Than Unsigned",
50 {PdV=f8BITSOF(fCAST8u(RssV)>fCAST8u(RttV));})
55 /*********************************************/
56 /* Compare and put result in GPR             */
57 /*  typically for function I/O               */
58 /*********************************************/
60 Q6INSN(A4_rcmpeqi,"Rd32=cmp.eq(Rs32,#s8)",ATTRIBS(),
61 "Compare for Equal",
62 {fIMMEXT(siV); RdV=(RsV==siV); })
64 Q6INSN(A4_rcmpneqi,"Rd32=!cmp.eq(Rs32,#s8)",ATTRIBS(),
65 "Compare for Equal",
66 {fIMMEXT(siV); RdV=(RsV!=siV); })
69 Q6INSN(A4_rcmpeq,"Rd32=cmp.eq(Rs32,Rt32)",ATTRIBS(),
70 "Compare for Equal",
71 {RdV=(RsV==RtV); })
73 Q6INSN(A4_rcmpneq,"Rd32=!cmp.eq(Rs32,Rt32)",ATTRIBS(),
74 "Compare for Equal",
75 {RdV=(RsV!=RtV); })
79 /*********************************************/
80 /* Scalar compare instructions               */
81 /*********************************************/
84 Q6INSN(C2_bitsset,"Pd4=bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
85 "Compare for selected bits set",
86 {PdV=f8BITSOF((RsV&RtV)==RtV);})
88 Q6INSN(C2_bitsclr,"Pd4=bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
89 "Compare for selected bits clear",
90 {PdV=f8BITSOF((RsV&RtV)==0);})
93 Q6INSN(C4_nbitsset,"Pd4=!bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
94 "Compare for selected bits set",
95 {PdV=f8BITSOF((RsV&RtV)!=RtV);})
97 Q6INSN(C4_nbitsclr,"Pd4=!bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
98 "Compare for selected bits clear",
99 {PdV=f8BITSOF((RsV&RtV)!=0);})
103 /*********************************************/
104 /* Scalar compare instructions W/ immediate  */
105 /*********************************************/
107 Q6INSN(C2_cmpeqi,"Pd4=cmp.eq(Rs32,#s10)",ATTRIBS(),
108 "Compare for Equal",
109 {fIMMEXT(siV); PdV=f8BITSOF(RsV==siV);})
111 Q6INSN(C2_cmpgti,"Pd4=cmp.gt(Rs32,#s10)",ATTRIBS(),
112 "Compare for signed Greater Than",
113 {fIMMEXT(siV); PdV=f8BITSOF(RsV>siV);})
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));})
119 Q6INSN(C2_bitsclri,"Pd4=bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
120 "Compare for selected bits clear",
121 {PdV=f8BITSOF((RsV&uiV)==0);})
123 Q6INSN(C4_nbitsclri,"Pd4=!bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
124 "Compare for selected bits clear",
125 {PdV=f8BITSOF((RsV&uiV)!=0);})
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));})
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));})
142 /* Predicate Logical Operations */
144 Q6INSN(C2_and,"Pd4=and(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
145 "Predicate AND",
146 {PdV=PsV & PtV;})
148 Q6INSN(C2_or,"Pd4=or(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
149 "Predicate OR",
150 {PdV=PsV | PtV;})
152 Q6INSN(C2_xor,"Pd4=xor(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
153 "Predicate XOR",
154 {PdV=PsV ^ PtV;})
156 Q6INSN(C2_andn,"Pd4=and(Pt4,!Ps4)",ATTRIBS(A_CRSLOT23),
157 "Predicate AND NOT",
158 {PdV=PtV & (~PsV);})
160 Q6INSN(C2_not,"Pd4=not(Ps4)",ATTRIBS(A_CRSLOT23),
161 "Logical NOT Predicate",
162 {PdV=~PsV;})
164 Q6INSN(C2_orn,"Pd4=or(Pt4,!Ps4)",ATTRIBS(A_ARCHV2,A_CRSLOT23),
165 "Predicate OR NOT",
166 {PdV=PtV | (~PsV);})
172 Q6INSN(C4_and_and,"Pd4=and(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
173 "Compound And-And", { PdV = PsV & PtV & PuV; })
175 Q6INSN(C4_and_or,"Pd4=and(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
176 "Compound And-Or", { PdV = PsV &  (PtV | PuV); })
178 Q6INSN(C4_or_and,"Pd4=or(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
179 "Compound Or-And", { PdV = PsV | (PtV & PuV); })
181 Q6INSN(C4_or_or,"Pd4=or(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
182 "Compound Or-Or", { PdV = PsV | PtV | PuV; })
186 Q6INSN(C4_and_andn,"Pd4=and(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
187 "Compound And-And", { PdV = PsV & PtV & (~PuV); })
189 Q6INSN(C4_and_orn,"Pd4=and(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
190 "Compound And-Or", { PdV = PsV &  (PtV | (~PuV)); })
192 Q6INSN(C4_or_andn,"Pd4=or(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
193 "Compound Or-And", { PdV = PsV | (PtV & (~PuV)); })
195 Q6INSN(C4_or_orn,"Pd4=or(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
196 "Compound Or-Or", { PdV = PsV | PtV | (~PuV); })
199 Q6INSN(C2_any8,"Pd4=any8(Ps4)",ATTRIBS(A_CRSLOT23),
200 "Logical ANY of low 8 predicate bits",
201 { PdV = (PsV ? 0xff : 0x00); })
203 Q6INSN(C2_all8,"Pd4=all8(Ps4)",ATTRIBS(A_CRSLOT23),
204 "Logical ALL of low 8 predicate bits",
205 { PdV = (PsV == 0xff ? 0xff : 0x00); })
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); })
211 /* Mux instructions */
213 Q6INSN(C2_mux,"Rd32=mux(Pu4,Rs32,Rt32)",ATTRIBS(),
214 "Scalar MUX",
215 { RdV = (fLSBOLD(PuV) ? RsV : RtV); })
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;})
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;})
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;})
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;})
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;}
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;}
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;}
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;}
270 Q6INSN(C2_muxii,"Rd32=mux(Pu4,#s8,#S8)",ATTRIBS(A_ARCHV2),
271 "Scalar MUX immediates",
272 { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : SiV); })
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); })
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); })
287 Q6INSN(C2_vmux,"Rdd32=vmux(Pu4,Rss32,Rtt32)",ATTRIBS(),
288 "Vector MUX",
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     }
296 Q6INSN(C2_mask,"Rdd32=mask(Pt4)",ATTRIBS(),
297 "Vector Mask Generation",
299     fHIDE(int i;)
300     for (i = 0; i < 8; i++) {
301         fSETBYTE(i,RddV,(fGETBIT(i,PtV)?(0xff):(0x00)));
302     }
305 /* VCMP */
307 Q6INSN(A2_vcmpbeq,"Pd4=vcmpb.eq(Rss32,Rtt32)",ATTRIBS(),
308 "Compare elements of two vectors ",
310     fHIDE(int i;)
311     for (i = 0; i < 8; i++) {
312         fSETBIT(i,PdV,(fGETBYTE(i,RssV) == fGETBYTE(i,RttV)));
313     }
316 Q6INSN(A4_vcmpbeqi,"Pd4=vcmpb.eq(Rss32,#u8)",ATTRIBS(),
317 "Compare elements of two vectors ",
319     fHIDE(int i;)
320     for (i = 0; i < 8; i++) {
321         fSETBIT(i,PdV,(fGETUBYTE(i,RssV) == uiV));
322     }
325 Q6INSN(A4_vcmpbeq_any,"Pd4=any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(),
326 "Compare elements of two vectors ",
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     }
335 Q6INSN(A6_vcmpbeq_notany,"Pd4=!any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(),
336 "Compare elements of two vectors ",
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;
346 Q6INSN(A2_vcmpbgtu,"Pd4=vcmpb.gtu(Rss32,Rtt32)",ATTRIBS(),
347 "Compare elements of two vectors ",
349     fHIDE(int i;)
350     for (i = 0; i < 8; i++) {
351         fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > fGETUBYTE(i,RttV)));
352     }
355 Q6INSN(A4_vcmpbgtui,"Pd4=vcmpb.gtu(Rss32,#u7)",ATTRIBS(),
356 "Compare elements of two vectors ",
358     fHIDE(int i;)
359     for (i = 0; i < 8; i++) {
360         fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > uiV));
361     }
364 Q6INSN(A4_vcmpbgt,"Pd4=vcmpb.gt(Rss32,Rtt32)",ATTRIBS(),
365 "Compare elements of two vectors ",
367     fHIDE(int i;)
368     for (i = 0; i < 8; i++) {
369         fSETBIT(i,PdV,(fGETBYTE(i,RssV) > fGETBYTE(i,RttV)));
370     }
373 Q6INSN(A4_vcmpbgti,"Pd4=vcmpb.gt(Rss32,#s8)",ATTRIBS(),
374 "Compare elements of two vectors ",
376     fHIDE(int i;)
377     for (i = 0; i < 8; i++) {
378         fSETBIT(i,PdV,(fGETBYTE(i,RssV) > siV));
379     }
384 Q6INSN(A4_cmpbeq,"Pd4=cmpb.eq(Rs32,Rt32)",ATTRIBS(),
385 "Compare bytes ",
387     PdV=f8BITSOF(fGETBYTE(0,RsV) == fGETBYTE(0,RtV));
390 Q6INSN(A4_cmpbeqi,"Pd4=cmpb.eq(Rs32,#u8)",ATTRIBS(),
391 "Compare bytes ",
393     PdV=f8BITSOF(fGETUBYTE(0,RsV) == uiV);
396 Q6INSN(A4_cmpbgtu,"Pd4=cmpb.gtu(Rs32,Rt32)",ATTRIBS(),
397 "Compare bytes ",
399     PdV=f8BITSOF(fGETUBYTE(0,RsV) > fGETUBYTE(0,RtV));
402 Q6INSN(A4_cmpbgtui,"Pd4=cmpb.gtu(Rs32,#u7)",ATTRIBS(),
403 "Compare bytes ",
405     fIMMEXT(uiV);
406     PdV=f8BITSOF(fGETUBYTE(0,RsV) > fCAST4u(uiV));
409 Q6INSN(A4_cmpbgt,"Pd4=cmpb.gt(Rs32,Rt32)",ATTRIBS(),
410 "Compare bytes ",
412     PdV=f8BITSOF(fGETBYTE(0,RsV) > fGETBYTE(0,RtV));
415 Q6INSN(A4_cmpbgti,"Pd4=cmpb.gt(Rs32,#s8)",ATTRIBS(),
416 "Compare bytes ",
418     PdV=f8BITSOF(fGETBYTE(0,RsV) > siV);
421 Q6INSN(A2_vcmpheq,"Pd4=vcmph.eq(Rss32,Rtt32)",ATTRIBS(),
422 "Compare elements of two vectors ",
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     }
431 Q6INSN(A2_vcmphgt,"Pd4=vcmph.gt(Rss32,Rtt32)",ATTRIBS(),
432 "Compare elements of two vectors ",
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     }
441 Q6INSN(A2_vcmphgtu,"Pd4=vcmph.gtu(Rss32,Rtt32)",ATTRIBS(),
442 "Compare elements of two vectors ",
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     }
451 Q6INSN(A4_vcmpheqi,"Pd4=vcmph.eq(Rss32,#s8)",ATTRIBS(),
452 "Compare elements of two vectors ",
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     }
461 Q6INSN(A4_vcmphgti,"Pd4=vcmph.gt(Rss32,#s8)",ATTRIBS(),
462 "Compare elements of two vectors ",
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     }
472 Q6INSN(A4_vcmphgtui,"Pd4=vcmph.gtu(Rss32,#u7)",ATTRIBS(),
473 "Compare elements of two vectors ",
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     }
482 Q6INSN(A4_cmpheq,"Pd4=cmph.eq(Rs32,Rt32)",ATTRIBS(),
483 "Compare halfwords ",
485     PdV=f8BITSOF(fGETHALF(0,RsV) == fGETHALF(0,RtV));
488 Q6INSN(A4_cmphgt,"Pd4=cmph.gt(Rs32,Rt32)",ATTRIBS(),
489 "Compare halfwords ",
491     PdV=f8BITSOF(fGETHALF(0,RsV) > fGETHALF(0,RtV));
494 Q6INSN(A4_cmphgtu,"Pd4=cmph.gtu(Rs32,Rt32)",ATTRIBS(),
495 "Compare halfwords ",
497     PdV=f8BITSOF(fGETUHALF(0,RsV) > fGETUHALF(0,RtV));
500 Q6INSN(A4_cmpheqi,"Pd4=cmph.eq(Rs32,#s8)",ATTRIBS(),
501 "Compare halfwords ",
503     fIMMEXT(siV);
504     PdV=f8BITSOF(fGETHALF(0,RsV) == siV);
507 Q6INSN(A4_cmphgti,"Pd4=cmph.gt(Rs32,#s8)",ATTRIBS(),
508 "Compare halfwords ",
510     fIMMEXT(siV);
511     PdV=f8BITSOF(fGETHALF(0,RsV) > siV);
514 Q6INSN(A4_cmphgtui,"Pd4=cmph.gtu(Rs32,#u7)",ATTRIBS(),
515 "Compare halfwords ",
517     fIMMEXT(uiV);
518     PdV=f8BITSOF(fGETUHALF(0,RsV) > fCAST4u(uiV));
521 Q6INSN(A2_vcmpweq,"Pd4=vcmpw.eq(Rss32,Rtt32)",ATTRIBS(),
522 "Compare elements of two vectors ",
524     fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==fGETWORD(0,RttV)));
525     fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==fGETWORD(1,RttV)));
528 Q6INSN(A2_vcmpwgt,"Pd4=vcmpw.gt(Rss32,Rtt32)",ATTRIBS(),
529 "Compare elements of two vectors ",
531     fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>fGETWORD(0,RttV)));
532     fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>fGETWORD(1,RttV)));
535 Q6INSN(A2_vcmpwgtu,"Pd4=vcmpw.gtu(Rss32,Rtt32)",ATTRIBS(),
536 "Compare elements of two vectors ",
538     fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fGETUWORD(0,RttV)));
539     fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fGETUWORD(1,RttV)));
542 Q6INSN(A4_vcmpweqi,"Pd4=vcmpw.eq(Rss32,#s8)",ATTRIBS(),
543 "Compare elements of two vectors ",
545     fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==siV));
546     fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==siV));
549 Q6INSN(A4_vcmpwgti,"Pd4=vcmpw.gt(Rss32,#s8)",ATTRIBS(),
550 "Compare elements of two vectors ",
552     fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>siV));
553     fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>siV));
556 Q6INSN(A4_vcmpwgtui,"Pd4=vcmpw.gtu(Rss32,#u7)",ATTRIBS(),
557 "Compare elements of two vectors ",
559     fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fCAST4u(uiV)));
560     fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fCAST4u(uiV)));
563 Q6INSN(A4_boundscheck_hi,"Pd4=boundscheck(Rss32,Rtt32):raw:hi",ATTRIBS(),
564 "Detect if a register is within bounds",
566     fHIDE(size4u_t src;)
567     src = fGETUWORD(1,RssV);
568     PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV)));
571 Q6INSN(A4_boundscheck_lo,"Pd4=boundscheck(Rss32,Rtt32):raw:lo",ATTRIBS(),
572 "Detect if a register is within bounds",
574     fHIDE(size4u_t src;)
575     src = fGETUWORD(0,RssV);
576     PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV)));
579 Q6INSN(A4_tlbmatch,"Pd4=tlbmatch(Rss32,Rt32)",ATTRIBS(),
580 "Detect if a VA/ASID matches a TLB entry",
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)));
591 Q6INSN(C2_tfrpr,"Rd32=Ps4",ATTRIBS(),
592 "Transfer predicate to general register", { RdV = fZXTN(8,32,PsV); })
594 Q6INSN(C2_tfrrp,"Pd4=Rs32",ATTRIBS(),
595 "Transfer general register to Predicate", { PdV = fGETUBYTE(0,RsV); })
597 Q6INSN(C4_fastcorner9,"Pd4=fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
598 "Determine whether the predicate sources define a corner",
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);
609 Q6INSN(C4_fastcorner9_not,"Pd4=!fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
610 "Determine whether the predicate sources define a corner",
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);