qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

compare.idef (17093B)


      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 })