]>
Commit | Line | Data |
---|---|---|
7cf9345c TS |
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", | |
9fe33c0e | 201 | { PdV = (PsV ? 0xff : 0x00); }) |
7cf9345c TS |
202 | |
203 | Q6INSN(C2_all8,"Pd4=all8(Ps4)",ATTRIBS(A_CRSLOT23), | |
204 | "Logical ALL of low 8 predicate bits", | |
9fe33c0e | 205 | { PdV = (PsV == 0xff ? 0xff : 0x00); }) |
7cf9345c TS |
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", | |
9fe33c0e | 215 | { RdV = (fLSBOLD(PuV) ? RsV : RtV); }) |
7cf9345c TS |
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", | |
9fe33c0e | 272 | { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : SiV); }) |
7cf9345c TS |
273 | |
274 | ||
275 | ||
276 | Q6INSN(C2_muxir,"Rd32=mux(Pu4,Rs32,#s8)",ATTRIBS(A_ARCHV2), | |
277 | "Scalar MUX register immediate", | |
9fe33c0e | 278 | { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? RsV : siV); }) |
7cf9345c TS |
279 | |
280 | ||
281 | Q6INSN(C2_muxri,"Rd32=mux(Pu4,#s8,Rs32)",ATTRIBS(A_ARCHV2), | |
282 | "Scalar MUX register immediate", | |
9fe33c0e | 283 | { fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : RsV); }) |
7cf9345c TS |
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 | }) |