xref: /qemu/target/hexagon/imported/compare.idef (revision 15106f7dc3290ff3254611f265849a314a93eb0e)
17cf9345cSTaylor Simpson/*
27cf9345cSTaylor Simpson *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
37cf9345cSTaylor Simpson *
47cf9345cSTaylor Simpson *  This program is free software; you can redistribute it and/or modify
57cf9345cSTaylor Simpson *  it under the terms of the GNU General Public License as published by
67cf9345cSTaylor Simpson *  the Free Software Foundation; either version 2 of the License, or
77cf9345cSTaylor Simpson *  (at your option) any later version.
87cf9345cSTaylor Simpson *
97cf9345cSTaylor Simpson *  This program is distributed in the hope that it will be useful,
107cf9345cSTaylor Simpson *  but WITHOUT ANY WARRANTY; without even the implied warranty of
117cf9345cSTaylor Simpson *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
127cf9345cSTaylor Simpson *  GNU General Public License for more details.
137cf9345cSTaylor Simpson *
147cf9345cSTaylor Simpson *  You should have received a copy of the GNU General Public License
157cf9345cSTaylor Simpson *  along with this program; if not, see <http://www.gnu.org/licenses/>.
167cf9345cSTaylor Simpson */
177cf9345cSTaylor Simpson
187cf9345cSTaylor Simpson/*
197cf9345cSTaylor Simpson * Compare Instructions
207cf9345cSTaylor Simpson */
217cf9345cSTaylor Simpson
227cf9345cSTaylor Simpson
237cf9345cSTaylor Simpson
247cf9345cSTaylor Simpson/*********************************************/
257cf9345cSTaylor Simpson/* Scalar compare instructions               */
267cf9345cSTaylor Simpson/*********************************************/
277cf9345cSTaylor Simpson
287cf9345cSTaylor SimpsonQ6INSN(C2_cmpeq,"Pd4=cmp.eq(Rs32,Rt32)",ATTRIBS(),
297cf9345cSTaylor Simpson"Compare for Equal",
307cf9345cSTaylor Simpson{PdV=f8BITSOF(RsV==RtV);})
317cf9345cSTaylor Simpson
327cf9345cSTaylor SimpsonQ6INSN(C2_cmpgt,"Pd4=cmp.gt(Rs32,Rt32)",ATTRIBS(),
337cf9345cSTaylor Simpson"Compare for signed Greater Than",
347cf9345cSTaylor Simpson{PdV=f8BITSOF(RsV>RtV);})
357cf9345cSTaylor Simpson
367cf9345cSTaylor SimpsonQ6INSN(C2_cmpgtu,"Pd4=cmp.gtu(Rs32,Rt32)",ATTRIBS(),
377cf9345cSTaylor Simpson"Compare for Greater Than Unsigned",
387cf9345cSTaylor Simpson{PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(RtV));})
397cf9345cSTaylor Simpson
407cf9345cSTaylor SimpsonQ6INSN(C2_cmpeqp,"Pd4=cmp.eq(Rss32,Rtt32)",ATTRIBS(),
417cf9345cSTaylor Simpson"Compare for Equal",
427cf9345cSTaylor Simpson{PdV=f8BITSOF(RssV==RttV);})
437cf9345cSTaylor Simpson
447cf9345cSTaylor SimpsonQ6INSN(C2_cmpgtp,"Pd4=cmp.gt(Rss32,Rtt32)",ATTRIBS(),
457cf9345cSTaylor Simpson"Compare for signed Greater Than",
467cf9345cSTaylor Simpson{PdV=f8BITSOF(RssV>RttV);})
477cf9345cSTaylor Simpson
487cf9345cSTaylor SimpsonQ6INSN(C2_cmpgtup,"Pd4=cmp.gtu(Rss32,Rtt32)",ATTRIBS(),
497cf9345cSTaylor Simpson"Compare for Greater Than Unsigned",
507cf9345cSTaylor Simpson{PdV=f8BITSOF(fCAST8u(RssV)>fCAST8u(RttV));})
517cf9345cSTaylor Simpson
527cf9345cSTaylor Simpson
537cf9345cSTaylor Simpson
547cf9345cSTaylor Simpson
557cf9345cSTaylor Simpson/*********************************************/
567cf9345cSTaylor Simpson/* Compare and put result in GPR             */
577cf9345cSTaylor Simpson/*  typically for function I/O               */
587cf9345cSTaylor Simpson/*********************************************/
597cf9345cSTaylor Simpson
607cf9345cSTaylor SimpsonQ6INSN(A4_rcmpeqi,"Rd32=cmp.eq(Rs32,#s8)",ATTRIBS(),
617cf9345cSTaylor Simpson"Compare for Equal",
627cf9345cSTaylor Simpson{fIMMEXT(siV); RdV=(RsV==siV); })
637cf9345cSTaylor Simpson
647cf9345cSTaylor SimpsonQ6INSN(A4_rcmpneqi,"Rd32=!cmp.eq(Rs32,#s8)",ATTRIBS(),
657cf9345cSTaylor Simpson"Compare for Equal",
667cf9345cSTaylor Simpson{fIMMEXT(siV); RdV=(RsV!=siV); })
677cf9345cSTaylor Simpson
687cf9345cSTaylor Simpson
697cf9345cSTaylor SimpsonQ6INSN(A4_rcmpeq,"Rd32=cmp.eq(Rs32,Rt32)",ATTRIBS(),
707cf9345cSTaylor Simpson"Compare for Equal",
717cf9345cSTaylor Simpson{RdV=(RsV==RtV); })
727cf9345cSTaylor Simpson
737cf9345cSTaylor SimpsonQ6INSN(A4_rcmpneq,"Rd32=!cmp.eq(Rs32,Rt32)",ATTRIBS(),
747cf9345cSTaylor Simpson"Compare for Equal",
757cf9345cSTaylor Simpson{RdV=(RsV!=RtV); })
767cf9345cSTaylor Simpson
777cf9345cSTaylor Simpson
787cf9345cSTaylor Simpson
797cf9345cSTaylor Simpson/*********************************************/
807cf9345cSTaylor Simpson/* Scalar compare instructions               */
817cf9345cSTaylor Simpson/*********************************************/
827cf9345cSTaylor Simpson
837cf9345cSTaylor Simpson
847cf9345cSTaylor SimpsonQ6INSN(C2_bitsset,"Pd4=bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
857cf9345cSTaylor Simpson"Compare for selected bits set",
867cf9345cSTaylor Simpson{PdV=f8BITSOF((RsV&RtV)==RtV);})
877cf9345cSTaylor Simpson
887cf9345cSTaylor SimpsonQ6INSN(C2_bitsclr,"Pd4=bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
897cf9345cSTaylor Simpson"Compare for selected bits clear",
907cf9345cSTaylor Simpson{PdV=f8BITSOF((RsV&RtV)==0);})
917cf9345cSTaylor Simpson
927cf9345cSTaylor Simpson
937cf9345cSTaylor SimpsonQ6INSN(C4_nbitsset,"Pd4=!bitsset(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
947cf9345cSTaylor Simpson"Compare for selected bits set",
957cf9345cSTaylor Simpson{PdV=f8BITSOF((RsV&RtV)!=RtV);})
967cf9345cSTaylor Simpson
977cf9345cSTaylor SimpsonQ6INSN(C4_nbitsclr,"Pd4=!bitsclr(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
987cf9345cSTaylor Simpson"Compare for selected bits clear",
997cf9345cSTaylor Simpson{PdV=f8BITSOF((RsV&RtV)!=0);})
1007cf9345cSTaylor Simpson
1017cf9345cSTaylor Simpson
1027cf9345cSTaylor Simpson
1037cf9345cSTaylor Simpson/*********************************************/
1047cf9345cSTaylor Simpson/* Scalar compare instructions W/ immediate  */
1057cf9345cSTaylor Simpson/*********************************************/
1067cf9345cSTaylor Simpson
1077cf9345cSTaylor SimpsonQ6INSN(C2_cmpeqi,"Pd4=cmp.eq(Rs32,#s10)",ATTRIBS(),
1087cf9345cSTaylor Simpson"Compare for Equal",
1097cf9345cSTaylor Simpson{fIMMEXT(siV); PdV=f8BITSOF(RsV==siV);})
1107cf9345cSTaylor Simpson
1117cf9345cSTaylor SimpsonQ6INSN(C2_cmpgti,"Pd4=cmp.gt(Rs32,#s10)",ATTRIBS(),
1127cf9345cSTaylor Simpson"Compare for signed Greater Than",
1137cf9345cSTaylor Simpson{fIMMEXT(siV); PdV=f8BITSOF(RsV>siV);})
1147cf9345cSTaylor Simpson
1157cf9345cSTaylor SimpsonQ6INSN(C2_cmpgtui,"Pd4=cmp.gtu(Rs32,#u9)",ATTRIBS(),
1167cf9345cSTaylor Simpson"Compare for Greater Than Unsigned",
1177cf9345cSTaylor Simpson{fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)>fCAST4u(uiV));})
1187cf9345cSTaylor Simpson
1197cf9345cSTaylor SimpsonQ6INSN(C2_bitsclri,"Pd4=bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
1207cf9345cSTaylor Simpson"Compare for selected bits clear",
1217cf9345cSTaylor Simpson{PdV=f8BITSOF((RsV&uiV)==0);})
1227cf9345cSTaylor Simpson
1237cf9345cSTaylor SimpsonQ6INSN(C4_nbitsclri,"Pd4=!bitsclr(Rs32,#u6)",ATTRIBS(A_ARCHV2),
1247cf9345cSTaylor Simpson"Compare for selected bits clear",
1257cf9345cSTaylor Simpson{PdV=f8BITSOF((RsV&uiV)!=0);})
1267cf9345cSTaylor Simpson
1277cf9345cSTaylor Simpson
1287cf9345cSTaylor Simpson
1297cf9345cSTaylor Simpson
1307cf9345cSTaylor SimpsonQ6INSN(C4_cmpneqi,"Pd4=!cmp.eq(Rs32,#s10)",ATTRIBS(), "Compare for Not Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV!=siV);})
1317cf9345cSTaylor SimpsonQ6INSN(C4_cmpltei,"Pd4=!cmp.gt(Rs32,#s10)",ATTRIBS(), "Compare for Less Than or Equal", {fIMMEXT(siV); PdV=f8BITSOF(RsV<=siV);})
1327cf9345cSTaylor SimpsonQ6INSN(C4_cmplteui,"Pd4=!cmp.gtu(Rs32,#u9)",ATTRIBS(), "Compare for Less Than or Equal Unsigned", {fIMMEXT(uiV); PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(uiV));})
1337cf9345cSTaylor Simpson
1347cf9345cSTaylor SimpsonQ6INSN(C4_cmpneq,"Pd4=!cmp.eq(Rs32,Rt32)",ATTRIBS(), "And-Compare for Equal", {PdV=f8BITSOF(RsV!=RtV);})
1357cf9345cSTaylor SimpsonQ6INSN(C4_cmplte,"Pd4=!cmp.gt(Rs32,Rt32)",ATTRIBS(), "And-Compare for signed Greater Than", {PdV=f8BITSOF(RsV<=RtV);})
1367cf9345cSTaylor SimpsonQ6INSN(C4_cmplteu,"Pd4=!cmp.gtu(Rs32,Rt32)",ATTRIBS(), "And-Compare for Greater Than Unsigned", {PdV=f8BITSOF(fCAST4u(RsV)<=fCAST4u(RtV));})
1377cf9345cSTaylor Simpson
1387cf9345cSTaylor Simpson
1397cf9345cSTaylor Simpson
1407cf9345cSTaylor Simpson
1417cf9345cSTaylor Simpson
1427cf9345cSTaylor Simpson/* Predicate Logical Operations */
1437cf9345cSTaylor Simpson
1447cf9345cSTaylor SimpsonQ6INSN(C2_and,"Pd4=and(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
1457cf9345cSTaylor Simpson"Predicate AND",
1467cf9345cSTaylor Simpson{PdV=PsV & PtV;})
1477cf9345cSTaylor Simpson
1487cf9345cSTaylor SimpsonQ6INSN(C2_or,"Pd4=or(Pt4,Ps4)",ATTRIBS(A_CRSLOT23),
1497cf9345cSTaylor Simpson"Predicate OR",
1507cf9345cSTaylor Simpson{PdV=PsV | PtV;})
1517cf9345cSTaylor Simpson
1527cf9345cSTaylor SimpsonQ6INSN(C2_xor,"Pd4=xor(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
1537cf9345cSTaylor Simpson"Predicate XOR",
1547cf9345cSTaylor Simpson{PdV=PsV ^ PtV;})
1557cf9345cSTaylor Simpson
1567cf9345cSTaylor SimpsonQ6INSN(C2_andn,"Pd4=and(Pt4,!Ps4)",ATTRIBS(A_CRSLOT23),
1577cf9345cSTaylor Simpson"Predicate AND NOT",
1587cf9345cSTaylor Simpson{PdV=PtV & (~PsV);})
1597cf9345cSTaylor Simpson
1607cf9345cSTaylor SimpsonQ6INSN(C2_not,"Pd4=not(Ps4)",ATTRIBS(A_CRSLOT23),
1617cf9345cSTaylor Simpson"Logical NOT Predicate",
1627cf9345cSTaylor Simpson{PdV=~PsV;})
1637cf9345cSTaylor Simpson
1647cf9345cSTaylor SimpsonQ6INSN(C2_orn,"Pd4=or(Pt4,!Ps4)",ATTRIBS(A_ARCHV2,A_CRSLOT23),
1657cf9345cSTaylor Simpson"Predicate OR NOT",
1667cf9345cSTaylor Simpson{PdV=PtV | (~PsV);})
1677cf9345cSTaylor Simpson
1687cf9345cSTaylor Simpson
1697cf9345cSTaylor Simpson
1707cf9345cSTaylor Simpson
1717cf9345cSTaylor Simpson
1727cf9345cSTaylor SimpsonQ6INSN(C4_and_and,"Pd4=and(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
1737cf9345cSTaylor Simpson"Compound And-And", { PdV = PsV & PtV & PuV; })
1747cf9345cSTaylor Simpson
1757cf9345cSTaylor SimpsonQ6INSN(C4_and_or,"Pd4=and(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
1767cf9345cSTaylor Simpson"Compound And-Or", { PdV = PsV &  (PtV | PuV); })
1777cf9345cSTaylor Simpson
1787cf9345cSTaylor SimpsonQ6INSN(C4_or_and,"Pd4=or(Ps4,and(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
1797cf9345cSTaylor Simpson"Compound Or-And", { PdV = PsV | (PtV & PuV); })
1807cf9345cSTaylor Simpson
1817cf9345cSTaylor SimpsonQ6INSN(C4_or_or,"Pd4=or(Ps4,or(Pt4,Pu4))",ATTRIBS(A_CRSLOT23),
1827cf9345cSTaylor Simpson"Compound Or-Or", { PdV = PsV | PtV | PuV; })
1837cf9345cSTaylor Simpson
1847cf9345cSTaylor Simpson
1857cf9345cSTaylor Simpson
1867cf9345cSTaylor SimpsonQ6INSN(C4_and_andn,"Pd4=and(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
1877cf9345cSTaylor Simpson"Compound And-And", { PdV = PsV & PtV & (~PuV); })
1887cf9345cSTaylor Simpson
1897cf9345cSTaylor SimpsonQ6INSN(C4_and_orn,"Pd4=and(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
1907cf9345cSTaylor Simpson"Compound And-Or", { PdV = PsV &  (PtV | (~PuV)); })
1917cf9345cSTaylor Simpson
1927cf9345cSTaylor SimpsonQ6INSN(C4_or_andn,"Pd4=or(Ps4,and(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
1937cf9345cSTaylor Simpson"Compound Or-And", { PdV = PsV | (PtV & (~PuV)); })
1947cf9345cSTaylor Simpson
1957cf9345cSTaylor SimpsonQ6INSN(C4_or_orn,"Pd4=or(Ps4,or(Pt4,!Pu4))",ATTRIBS(A_CRSLOT23),
1967cf9345cSTaylor Simpson"Compound Or-Or", { PdV = PsV | PtV | (~PuV); })
1977cf9345cSTaylor Simpson
1987cf9345cSTaylor Simpson
1997cf9345cSTaylor SimpsonQ6INSN(C2_any8,"Pd4=any8(Ps4)",ATTRIBS(A_CRSLOT23),
2007cf9345cSTaylor Simpson"Logical ANY of low 8 predicate bits",
201*9fe33c0eSTaylor Simpson{ PdV = (PsV ? 0xff : 0x00); })
2027cf9345cSTaylor Simpson
2037cf9345cSTaylor SimpsonQ6INSN(C2_all8,"Pd4=all8(Ps4)",ATTRIBS(A_CRSLOT23),
2047cf9345cSTaylor Simpson"Logical ALL of low 8 predicate bits",
205*9fe33c0eSTaylor Simpson{ PdV = (PsV == 0xff ? 0xff : 0x00); })
2067cf9345cSTaylor Simpson
2077cf9345cSTaylor SimpsonQ6INSN(C2_vitpack,"Rd32=vitpack(Ps4,Pt4)",ATTRIBS(),
2087cf9345cSTaylor Simpson"Pack the odd and even bits of two predicate registers",
2097cf9345cSTaylor Simpson{ RdV = (PsV&0x55) | (PtV&0xAA); })
2107cf9345cSTaylor Simpson
2117cf9345cSTaylor Simpson/* Mux instructions */
2127cf9345cSTaylor Simpson
2137cf9345cSTaylor SimpsonQ6INSN(C2_mux,"Rd32=mux(Pu4,Rs32,Rt32)",ATTRIBS(),
2147cf9345cSTaylor Simpson"Scalar MUX",
215*9fe33c0eSTaylor Simpson{ RdV = (fLSBOLD(PuV) ? RsV : RtV); })
2167cf9345cSTaylor Simpson
2177cf9345cSTaylor Simpson
2187cf9345cSTaylor SimpsonQ6INSN(C2_cmovenewit,"if (Pu4.new) Rd32=#s12",ATTRIBS(A_ARCHV2),
2197cf9345cSTaylor Simpson"Scalar conditional move",
2207cf9345cSTaylor Simpson{ fIMMEXT(siV); if (fLSBNEW(PuN)) RdV=siV; else CANCEL;})
2217cf9345cSTaylor Simpson
2227cf9345cSTaylor SimpsonQ6INSN(C2_cmovenewif,"if (!Pu4.new) Rd32=#s12",ATTRIBS(A_ARCHV2),
2237cf9345cSTaylor Simpson"Scalar conditional move",
2247cf9345cSTaylor Simpson{ fIMMEXT(siV); if (fLSBNEWNOT(PuN)) RdV=siV; else CANCEL;})
2257cf9345cSTaylor Simpson
2267cf9345cSTaylor SimpsonQ6INSN(C2_cmoveit,"if (Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2),
2277cf9345cSTaylor Simpson"Scalar conditional move",
2287cf9345cSTaylor Simpson{ fIMMEXT(siV); if (fLSBOLD(PuV)) RdV=siV; else CANCEL;})
2297cf9345cSTaylor Simpson
2307cf9345cSTaylor SimpsonQ6INSN(C2_cmoveif,"if (!Pu4) Rd32=#s12",ATTRIBS(A_ARCHV2),
2317cf9345cSTaylor Simpson"Scalar conditional move",
2327cf9345cSTaylor Simpson{ fIMMEXT(siV); if (fLSBOLDNOT(PuV)) RdV=siV; else CANCEL;})
2337cf9345cSTaylor Simpson
2347cf9345cSTaylor Simpson
2357cf9345cSTaylor Simpson
2367cf9345cSTaylor SimpsonQ6INSN(C2_ccombinewnewt,"if (Pu4.new) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
2377cf9345cSTaylor Simpson"Conditionally combine two words into a register pair",
2387cf9345cSTaylor Simpson{ if (fLSBNEW(PuN)) {
2397cf9345cSTaylor Simpson    fSETWORD(0,RddV,RtV);
2407cf9345cSTaylor Simpson    fSETWORD(1,RddV,RsV);
2417cf9345cSTaylor Simpson  } else {CANCEL;}
2427cf9345cSTaylor Simpson})
2437cf9345cSTaylor Simpson
2447cf9345cSTaylor SimpsonQ6INSN(C2_ccombinewnewf,"if (!Pu4.new) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
2457cf9345cSTaylor Simpson"Conditionally combine two words into a register pair",
2467cf9345cSTaylor Simpson{ if (fLSBNEWNOT(PuN)) {
2477cf9345cSTaylor Simpson    fSETWORD(0,RddV,RtV);
2487cf9345cSTaylor Simpson    fSETWORD(1,RddV,RsV);
2497cf9345cSTaylor Simpson  } else {CANCEL;}
2507cf9345cSTaylor Simpson})
2517cf9345cSTaylor Simpson
2527cf9345cSTaylor SimpsonQ6INSN(C2_ccombinewt,"if (Pu4) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
2537cf9345cSTaylor Simpson"Conditionally combine two words into a register pair",
2547cf9345cSTaylor Simpson{ if (fLSBOLD(PuV)) {
2557cf9345cSTaylor Simpson    fSETWORD(0,RddV,RtV);
2567cf9345cSTaylor Simpson    fSETWORD(1,RddV,RsV);
2577cf9345cSTaylor Simpson  } else {CANCEL;}
2587cf9345cSTaylor Simpson})
2597cf9345cSTaylor Simpson
2607cf9345cSTaylor SimpsonQ6INSN(C2_ccombinewf,"if (!Pu4) Rdd32=combine(Rs32,Rt32)",ATTRIBS(A_ARCHV2),
2617cf9345cSTaylor Simpson"Conditionally combine two words into a register pair",
2627cf9345cSTaylor Simpson{ if (fLSBOLDNOT(PuV)) {
2637cf9345cSTaylor Simpson    fSETWORD(0,RddV,RtV);
2647cf9345cSTaylor Simpson    fSETWORD(1,RddV,RsV);
2657cf9345cSTaylor Simpson  } else {CANCEL;}
2667cf9345cSTaylor Simpson})
2677cf9345cSTaylor Simpson
2687cf9345cSTaylor Simpson
2697cf9345cSTaylor Simpson
2707cf9345cSTaylor SimpsonQ6INSN(C2_muxii,"Rd32=mux(Pu4,#s8,#S8)",ATTRIBS(A_ARCHV2),
2717cf9345cSTaylor Simpson"Scalar MUX immediates",
272*9fe33c0eSTaylor Simpson{ fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : SiV); })
2737cf9345cSTaylor Simpson
2747cf9345cSTaylor Simpson
2757cf9345cSTaylor Simpson
2767cf9345cSTaylor SimpsonQ6INSN(C2_muxir,"Rd32=mux(Pu4,Rs32,#s8)",ATTRIBS(A_ARCHV2),
2777cf9345cSTaylor Simpson"Scalar MUX register immediate",
278*9fe33c0eSTaylor Simpson{ fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? RsV : siV); })
2797cf9345cSTaylor Simpson
2807cf9345cSTaylor Simpson
2817cf9345cSTaylor SimpsonQ6INSN(C2_muxri,"Rd32=mux(Pu4,#s8,Rs32)",ATTRIBS(A_ARCHV2),
2827cf9345cSTaylor Simpson"Scalar MUX register immediate",
283*9fe33c0eSTaylor Simpson{ fIMMEXT(siV); RdV = (fLSBOLD(PuV) ? siV : RsV); })
2847cf9345cSTaylor Simpson
2857cf9345cSTaylor Simpson
2867cf9345cSTaylor Simpson
2877cf9345cSTaylor SimpsonQ6INSN(C2_vmux,"Rdd32=vmux(Pu4,Rss32,Rtt32)",ATTRIBS(),
2887cf9345cSTaylor Simpson"Vector MUX",
2897cf9345cSTaylor Simpson{
2907cf9345cSTaylor Simpson    fHIDE(int i;)
2917cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
2927cf9345cSTaylor Simpson        fSETBYTE(i,RddV,(fGETBIT(i,PuV)?(fGETBYTE(i,RssV)):(fGETBYTE(i,RttV))));
2937cf9345cSTaylor Simpson    }
2947cf9345cSTaylor Simpson})
2957cf9345cSTaylor Simpson
2967cf9345cSTaylor SimpsonQ6INSN(C2_mask,"Rdd32=mask(Pt4)",ATTRIBS(),
2977cf9345cSTaylor Simpson"Vector Mask Generation",
2987cf9345cSTaylor Simpson{
2997cf9345cSTaylor Simpson    fHIDE(int i;)
3007cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3017cf9345cSTaylor Simpson        fSETBYTE(i,RddV,(fGETBIT(i,PtV)?(0xff):(0x00)));
3027cf9345cSTaylor Simpson    }
3037cf9345cSTaylor Simpson})
3047cf9345cSTaylor Simpson
3057cf9345cSTaylor Simpson/* VCMP */
3067cf9345cSTaylor Simpson
3077cf9345cSTaylor SimpsonQ6INSN(A2_vcmpbeq,"Pd4=vcmpb.eq(Rss32,Rtt32)",ATTRIBS(),
3087cf9345cSTaylor Simpson"Compare elements of two vectors ",
3097cf9345cSTaylor Simpson{
3107cf9345cSTaylor Simpson    fHIDE(int i;)
3117cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3127cf9345cSTaylor Simpson        fSETBIT(i,PdV,(fGETBYTE(i,RssV) == fGETBYTE(i,RttV)));
3137cf9345cSTaylor Simpson    }
3147cf9345cSTaylor Simpson})
3157cf9345cSTaylor Simpson
3167cf9345cSTaylor SimpsonQ6INSN(A4_vcmpbeqi,"Pd4=vcmpb.eq(Rss32,#u8)",ATTRIBS(),
3177cf9345cSTaylor Simpson"Compare elements of two vectors ",
3187cf9345cSTaylor Simpson{
3197cf9345cSTaylor Simpson    fHIDE(int i;)
3207cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3217cf9345cSTaylor Simpson        fSETBIT(i,PdV,(fGETUBYTE(i,RssV) == uiV));
3227cf9345cSTaylor Simpson    }
3237cf9345cSTaylor Simpson})
3247cf9345cSTaylor Simpson
3257cf9345cSTaylor SimpsonQ6INSN(A4_vcmpbeq_any,"Pd4=any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(),
3267cf9345cSTaylor Simpson"Compare elements of two vectors ",
3277cf9345cSTaylor Simpson{
3287cf9345cSTaylor Simpson    fHIDE(int i;)
3297cf9345cSTaylor Simpson    PdV = 0;
3307cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3317cf9345cSTaylor Simpson        if (fGETBYTE(i,RssV) == fGETBYTE(i,RttV)) PdV = 0xff;
3327cf9345cSTaylor Simpson    }
3337cf9345cSTaylor Simpson})
3347cf9345cSTaylor Simpson
3357cf9345cSTaylor SimpsonQ6INSN(A6_vcmpbeq_notany,"Pd4=!any8(vcmpb.eq(Rss32,Rtt32))",ATTRIBS(),
3367cf9345cSTaylor Simpson"Compare elements of two vectors ",
3377cf9345cSTaylor Simpson{
3387cf9345cSTaylor Simpson    fHIDE(int i;)
3397cf9345cSTaylor Simpson    PdV = 0;
3407cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3417cf9345cSTaylor Simpson        if (fGETBYTE(i,RssV) == fGETBYTE(i,RttV)) PdV = 0xff;
3427cf9345cSTaylor Simpson    }
3437cf9345cSTaylor Simpson    PdV = ~PdV;
3447cf9345cSTaylor Simpson})
3457cf9345cSTaylor Simpson
3467cf9345cSTaylor SimpsonQ6INSN(A2_vcmpbgtu,"Pd4=vcmpb.gtu(Rss32,Rtt32)",ATTRIBS(),
3477cf9345cSTaylor Simpson"Compare elements of two vectors ",
3487cf9345cSTaylor Simpson{
3497cf9345cSTaylor Simpson    fHIDE(int i;)
3507cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3517cf9345cSTaylor Simpson        fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > fGETUBYTE(i,RttV)));
3527cf9345cSTaylor Simpson    }
3537cf9345cSTaylor Simpson})
3547cf9345cSTaylor Simpson
3557cf9345cSTaylor SimpsonQ6INSN(A4_vcmpbgtui,"Pd4=vcmpb.gtu(Rss32,#u7)",ATTRIBS(),
3567cf9345cSTaylor Simpson"Compare elements of two vectors ",
3577cf9345cSTaylor Simpson{
3587cf9345cSTaylor Simpson    fHIDE(int i;)
3597cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3607cf9345cSTaylor Simpson        fSETBIT(i,PdV,(fGETUBYTE(i,RssV) > uiV));
3617cf9345cSTaylor Simpson    }
3627cf9345cSTaylor Simpson})
3637cf9345cSTaylor Simpson
3647cf9345cSTaylor SimpsonQ6INSN(A4_vcmpbgt,"Pd4=vcmpb.gt(Rss32,Rtt32)",ATTRIBS(),
3657cf9345cSTaylor Simpson"Compare elements of two vectors ",
3667cf9345cSTaylor Simpson{
3677cf9345cSTaylor Simpson    fHIDE(int i;)
3687cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3697cf9345cSTaylor Simpson        fSETBIT(i,PdV,(fGETBYTE(i,RssV) > fGETBYTE(i,RttV)));
3707cf9345cSTaylor Simpson    }
3717cf9345cSTaylor Simpson})
3727cf9345cSTaylor Simpson
3737cf9345cSTaylor SimpsonQ6INSN(A4_vcmpbgti,"Pd4=vcmpb.gt(Rss32,#s8)",ATTRIBS(),
3747cf9345cSTaylor Simpson"Compare elements of two vectors ",
3757cf9345cSTaylor Simpson{
3767cf9345cSTaylor Simpson    fHIDE(int i;)
3777cf9345cSTaylor Simpson    for (i = 0; i < 8; i++) {
3787cf9345cSTaylor Simpson        fSETBIT(i,PdV,(fGETBYTE(i,RssV) > siV));
3797cf9345cSTaylor Simpson    }
3807cf9345cSTaylor Simpson})
3817cf9345cSTaylor Simpson
3827cf9345cSTaylor Simpson
3837cf9345cSTaylor Simpson
3847cf9345cSTaylor SimpsonQ6INSN(A4_cmpbeq,"Pd4=cmpb.eq(Rs32,Rt32)",ATTRIBS(),
3857cf9345cSTaylor Simpson"Compare bytes ",
3867cf9345cSTaylor Simpson{
3877cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETBYTE(0,RsV) == fGETBYTE(0,RtV));
3887cf9345cSTaylor Simpson})
3897cf9345cSTaylor Simpson
3907cf9345cSTaylor SimpsonQ6INSN(A4_cmpbeqi,"Pd4=cmpb.eq(Rs32,#u8)",ATTRIBS(),
3917cf9345cSTaylor Simpson"Compare bytes ",
3927cf9345cSTaylor Simpson{
3937cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETUBYTE(0,RsV) == uiV);
3947cf9345cSTaylor Simpson})
3957cf9345cSTaylor Simpson
3967cf9345cSTaylor SimpsonQ6INSN(A4_cmpbgtu,"Pd4=cmpb.gtu(Rs32,Rt32)",ATTRIBS(),
3977cf9345cSTaylor Simpson"Compare bytes ",
3987cf9345cSTaylor Simpson{
3997cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETUBYTE(0,RsV) > fGETUBYTE(0,RtV));
4007cf9345cSTaylor Simpson})
4017cf9345cSTaylor Simpson
4027cf9345cSTaylor SimpsonQ6INSN(A4_cmpbgtui,"Pd4=cmpb.gtu(Rs32,#u7)",ATTRIBS(),
4037cf9345cSTaylor Simpson"Compare bytes ",
4047cf9345cSTaylor Simpson{
4057cf9345cSTaylor Simpson    fIMMEXT(uiV);
4067cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETUBYTE(0,RsV) > fCAST4u(uiV));
4077cf9345cSTaylor Simpson})
4087cf9345cSTaylor Simpson
4097cf9345cSTaylor SimpsonQ6INSN(A4_cmpbgt,"Pd4=cmpb.gt(Rs32,Rt32)",ATTRIBS(),
4107cf9345cSTaylor Simpson"Compare bytes ",
4117cf9345cSTaylor Simpson{
4127cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETBYTE(0,RsV) > fGETBYTE(0,RtV));
4137cf9345cSTaylor Simpson})
4147cf9345cSTaylor Simpson
4157cf9345cSTaylor SimpsonQ6INSN(A4_cmpbgti,"Pd4=cmpb.gt(Rs32,#s8)",ATTRIBS(),
4167cf9345cSTaylor Simpson"Compare bytes ",
4177cf9345cSTaylor Simpson{
4187cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETBYTE(0,RsV) > siV);
4197cf9345cSTaylor Simpson})
4207cf9345cSTaylor Simpson
4217cf9345cSTaylor SimpsonQ6INSN(A2_vcmpheq,"Pd4=vcmph.eq(Rss32,Rtt32)",ATTRIBS(),
4227cf9345cSTaylor Simpson"Compare elements of two vectors ",
4237cf9345cSTaylor Simpson{
4247cf9345cSTaylor Simpson    fHIDE(int i;)
4257cf9345cSTaylor Simpson    for (i = 0; i < 4; i++) {
4267cf9345cSTaylor Simpson        fSETBIT(i*2,PdV,  (fGETHALF(i,RssV) == fGETHALF(i,RttV)));
4277cf9345cSTaylor Simpson        fSETBIT(i*2+1,PdV,(fGETHALF(i,RssV) == fGETHALF(i,RttV)));
4287cf9345cSTaylor Simpson    }
4297cf9345cSTaylor Simpson})
4307cf9345cSTaylor Simpson
4317cf9345cSTaylor SimpsonQ6INSN(A2_vcmphgt,"Pd4=vcmph.gt(Rss32,Rtt32)",ATTRIBS(),
4327cf9345cSTaylor Simpson"Compare elements of two vectors ",
4337cf9345cSTaylor Simpson{
4347cf9345cSTaylor Simpson    fHIDE(int i;)
4357cf9345cSTaylor Simpson    for (i = 0; i < 4; i++) {
4367cf9345cSTaylor Simpson        fSETBIT(i*2,  PdV,  (fGETHALF(i,RssV) > fGETHALF(i,RttV)));
4377cf9345cSTaylor Simpson        fSETBIT(i*2+1,PdV,  (fGETHALF(i,RssV) > fGETHALF(i,RttV)));
4387cf9345cSTaylor Simpson    }
4397cf9345cSTaylor Simpson})
4407cf9345cSTaylor Simpson
4417cf9345cSTaylor SimpsonQ6INSN(A2_vcmphgtu,"Pd4=vcmph.gtu(Rss32,Rtt32)",ATTRIBS(),
4427cf9345cSTaylor Simpson"Compare elements of two vectors ",
4437cf9345cSTaylor Simpson{
4447cf9345cSTaylor Simpson    fHIDE(int i;)
4457cf9345cSTaylor Simpson    for (i = 0; i < 4; i++) {
4467cf9345cSTaylor Simpson        fSETBIT(i*2,  PdV,  (fGETUHALF(i,RssV) > fGETUHALF(i,RttV)));
4477cf9345cSTaylor Simpson        fSETBIT(i*2+1,PdV,  (fGETUHALF(i,RssV) > fGETUHALF(i,RttV)));
4487cf9345cSTaylor Simpson    }
4497cf9345cSTaylor Simpson})
4507cf9345cSTaylor Simpson
4517cf9345cSTaylor SimpsonQ6INSN(A4_vcmpheqi,"Pd4=vcmph.eq(Rss32,#s8)",ATTRIBS(),
4527cf9345cSTaylor Simpson"Compare elements of two vectors ",
4537cf9345cSTaylor Simpson{
4547cf9345cSTaylor Simpson    fHIDE(int i;)
4557cf9345cSTaylor Simpson    for (i = 0; i < 4; i++) {
4567cf9345cSTaylor Simpson        fSETBIT(i*2,PdV,  (fGETHALF(i,RssV) == siV));
4577cf9345cSTaylor Simpson        fSETBIT(i*2+1,PdV,(fGETHALF(i,RssV) == siV));
4587cf9345cSTaylor Simpson    }
4597cf9345cSTaylor Simpson})
4607cf9345cSTaylor Simpson
4617cf9345cSTaylor SimpsonQ6INSN(A4_vcmphgti,"Pd4=vcmph.gt(Rss32,#s8)",ATTRIBS(),
4627cf9345cSTaylor Simpson"Compare elements of two vectors ",
4637cf9345cSTaylor Simpson{
4647cf9345cSTaylor Simpson    fHIDE(int i;)
4657cf9345cSTaylor Simpson    for (i = 0; i < 4; i++) {
4667cf9345cSTaylor Simpson        fSETBIT(i*2,  PdV,  (fGETHALF(i,RssV) > siV));
4677cf9345cSTaylor Simpson        fSETBIT(i*2+1,PdV,  (fGETHALF(i,RssV) > siV));
4687cf9345cSTaylor Simpson    }
4697cf9345cSTaylor Simpson})
4707cf9345cSTaylor Simpson
4717cf9345cSTaylor Simpson
4727cf9345cSTaylor SimpsonQ6INSN(A4_vcmphgtui,"Pd4=vcmph.gtu(Rss32,#u7)",ATTRIBS(),
4737cf9345cSTaylor Simpson"Compare elements of two vectors ",
4747cf9345cSTaylor Simpson{
4757cf9345cSTaylor Simpson    fHIDE(int i;)
4767cf9345cSTaylor Simpson    for (i = 0; i < 4; i++) {
4777cf9345cSTaylor Simpson        fSETBIT(i*2,  PdV,  (fGETUHALF(i,RssV) > uiV));
4787cf9345cSTaylor Simpson        fSETBIT(i*2+1,PdV,  (fGETUHALF(i,RssV) > uiV));
4797cf9345cSTaylor Simpson    }
4807cf9345cSTaylor Simpson})
4817cf9345cSTaylor Simpson
4827cf9345cSTaylor SimpsonQ6INSN(A4_cmpheq,"Pd4=cmph.eq(Rs32,Rt32)",ATTRIBS(),
4837cf9345cSTaylor Simpson"Compare halfwords ",
4847cf9345cSTaylor Simpson{
4857cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETHALF(0,RsV) == fGETHALF(0,RtV));
4867cf9345cSTaylor Simpson})
4877cf9345cSTaylor Simpson
4887cf9345cSTaylor SimpsonQ6INSN(A4_cmphgt,"Pd4=cmph.gt(Rs32,Rt32)",ATTRIBS(),
4897cf9345cSTaylor Simpson"Compare halfwords ",
4907cf9345cSTaylor Simpson{
4917cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETHALF(0,RsV) > fGETHALF(0,RtV));
4927cf9345cSTaylor Simpson})
4937cf9345cSTaylor Simpson
4947cf9345cSTaylor SimpsonQ6INSN(A4_cmphgtu,"Pd4=cmph.gtu(Rs32,Rt32)",ATTRIBS(),
4957cf9345cSTaylor Simpson"Compare halfwords ",
4967cf9345cSTaylor Simpson{
4977cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETUHALF(0,RsV) > fGETUHALF(0,RtV));
4987cf9345cSTaylor Simpson})
4997cf9345cSTaylor Simpson
5007cf9345cSTaylor SimpsonQ6INSN(A4_cmpheqi,"Pd4=cmph.eq(Rs32,#s8)",ATTRIBS(),
5017cf9345cSTaylor Simpson"Compare halfwords ",
5027cf9345cSTaylor Simpson{
5037cf9345cSTaylor Simpson    fIMMEXT(siV);
5047cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETHALF(0,RsV) == siV);
5057cf9345cSTaylor Simpson})
5067cf9345cSTaylor Simpson
5077cf9345cSTaylor SimpsonQ6INSN(A4_cmphgti,"Pd4=cmph.gt(Rs32,#s8)",ATTRIBS(),
5087cf9345cSTaylor Simpson"Compare halfwords ",
5097cf9345cSTaylor Simpson{
5107cf9345cSTaylor Simpson    fIMMEXT(siV);
5117cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETHALF(0,RsV) > siV);
5127cf9345cSTaylor Simpson})
5137cf9345cSTaylor Simpson
5147cf9345cSTaylor SimpsonQ6INSN(A4_cmphgtui,"Pd4=cmph.gtu(Rs32,#u7)",ATTRIBS(),
5157cf9345cSTaylor Simpson"Compare halfwords ",
5167cf9345cSTaylor Simpson{
5177cf9345cSTaylor Simpson    fIMMEXT(uiV);
5187cf9345cSTaylor Simpson    PdV=f8BITSOF(fGETUHALF(0,RsV) > fCAST4u(uiV));
5197cf9345cSTaylor Simpson})
5207cf9345cSTaylor Simpson
5217cf9345cSTaylor SimpsonQ6INSN(A2_vcmpweq,"Pd4=vcmpw.eq(Rss32,Rtt32)",ATTRIBS(),
5227cf9345cSTaylor Simpson"Compare elements of two vectors ",
5237cf9345cSTaylor Simpson{
5247cf9345cSTaylor Simpson    fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==fGETWORD(0,RttV)));
5257cf9345cSTaylor Simpson    fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==fGETWORD(1,RttV)));
5267cf9345cSTaylor Simpson})
5277cf9345cSTaylor Simpson
5287cf9345cSTaylor SimpsonQ6INSN(A2_vcmpwgt,"Pd4=vcmpw.gt(Rss32,Rtt32)",ATTRIBS(),
5297cf9345cSTaylor Simpson"Compare elements of two vectors ",
5307cf9345cSTaylor Simpson{
5317cf9345cSTaylor Simpson    fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>fGETWORD(0,RttV)));
5327cf9345cSTaylor Simpson    fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>fGETWORD(1,RttV)));
5337cf9345cSTaylor Simpson})
5347cf9345cSTaylor Simpson
5357cf9345cSTaylor SimpsonQ6INSN(A2_vcmpwgtu,"Pd4=vcmpw.gtu(Rss32,Rtt32)",ATTRIBS(),
5367cf9345cSTaylor Simpson"Compare elements of two vectors ",
5377cf9345cSTaylor Simpson{
5387cf9345cSTaylor Simpson    fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fGETUWORD(0,RttV)));
5397cf9345cSTaylor Simpson    fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fGETUWORD(1,RttV)));
5407cf9345cSTaylor Simpson})
5417cf9345cSTaylor Simpson
5427cf9345cSTaylor SimpsonQ6INSN(A4_vcmpweqi,"Pd4=vcmpw.eq(Rss32,#s8)",ATTRIBS(),
5437cf9345cSTaylor Simpson"Compare elements of two vectors ",
5447cf9345cSTaylor Simpson{
5457cf9345cSTaylor Simpson    fSETBITS(3,0,PdV,(fGETWORD(0,RssV)==siV));
5467cf9345cSTaylor Simpson    fSETBITS(7,4,PdV,(fGETWORD(1,RssV)==siV));
5477cf9345cSTaylor Simpson})
5487cf9345cSTaylor Simpson
5497cf9345cSTaylor SimpsonQ6INSN(A4_vcmpwgti,"Pd4=vcmpw.gt(Rss32,#s8)",ATTRIBS(),
5507cf9345cSTaylor Simpson"Compare elements of two vectors ",
5517cf9345cSTaylor Simpson{
5527cf9345cSTaylor Simpson    fSETBITS(3,0,PdV,(fGETWORD(0,RssV)>siV));
5537cf9345cSTaylor Simpson    fSETBITS(7,4,PdV,(fGETWORD(1,RssV)>siV));
5547cf9345cSTaylor Simpson})
5557cf9345cSTaylor Simpson
5567cf9345cSTaylor SimpsonQ6INSN(A4_vcmpwgtui,"Pd4=vcmpw.gtu(Rss32,#u7)",ATTRIBS(),
5577cf9345cSTaylor Simpson"Compare elements of two vectors ",
5587cf9345cSTaylor Simpson{
5597cf9345cSTaylor Simpson    fSETBITS(3,0,PdV,(fGETUWORD(0,RssV)>fCAST4u(uiV)));
5607cf9345cSTaylor Simpson    fSETBITS(7,4,PdV,(fGETUWORD(1,RssV)>fCAST4u(uiV)));
5617cf9345cSTaylor Simpson})
5627cf9345cSTaylor Simpson
5637cf9345cSTaylor SimpsonQ6INSN(A4_boundscheck_hi,"Pd4=boundscheck(Rss32,Rtt32):raw:hi",ATTRIBS(),
5647cf9345cSTaylor Simpson"Detect if a register is within bounds",
5657cf9345cSTaylor Simpson{
5667cf9345cSTaylor Simpson    fHIDE(size4u_t src;)
5677cf9345cSTaylor Simpson    src = fGETUWORD(1,RssV);
5687cf9345cSTaylor Simpson    PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV)));
5697cf9345cSTaylor Simpson})
5707cf9345cSTaylor Simpson
5717cf9345cSTaylor SimpsonQ6INSN(A4_boundscheck_lo,"Pd4=boundscheck(Rss32,Rtt32):raw:lo",ATTRIBS(),
5727cf9345cSTaylor Simpson"Detect if a register is within bounds",
5737cf9345cSTaylor Simpson{
5747cf9345cSTaylor Simpson    fHIDE(size4u_t src;)
5757cf9345cSTaylor Simpson    src = fGETUWORD(0,RssV);
5767cf9345cSTaylor Simpson    PdV = f8BITSOF((fCAST4u(src) >= fGETUWORD(0,RttV)) && (fCAST4u(src) < fGETUWORD(1,RttV)));
5777cf9345cSTaylor Simpson})
5787cf9345cSTaylor Simpson
5797cf9345cSTaylor SimpsonQ6INSN(A4_tlbmatch,"Pd4=tlbmatch(Rss32,Rt32)",ATTRIBS(),
5807cf9345cSTaylor Simpson"Detect if a VA/ASID matches a TLB entry",
5817cf9345cSTaylor Simpson{
5827cf9345cSTaylor Simpson    fHIDE(size4u_t TLBHI; size4u_t TLBLO; size4u_t MASK; size4u_t SIZE;)
5837cf9345cSTaylor Simpson    MASK = 0x07ffffff;
5847cf9345cSTaylor Simpson    TLBLO = fGETUWORD(0,RssV);
5857cf9345cSTaylor Simpson    TLBHI = fGETUWORD(1,RssV);
5867cf9345cSTaylor Simpson    SIZE = fMIN(6,fCL1_4(~fBREV_4(TLBLO)));
5877cf9345cSTaylor Simpson    MASK &= (0xffffffff << 2*SIZE);
5887cf9345cSTaylor Simpson    PdV = f8BITSOF(fGETBIT(31,TLBHI) && ((TLBHI & MASK) == (RtV & MASK)));
5897cf9345cSTaylor Simpson})
5907cf9345cSTaylor Simpson
5917cf9345cSTaylor SimpsonQ6INSN(C2_tfrpr,"Rd32=Ps4",ATTRIBS(),
5927cf9345cSTaylor Simpson"Transfer predicate to general register", { RdV = fZXTN(8,32,PsV); })
5937cf9345cSTaylor Simpson
5947cf9345cSTaylor SimpsonQ6INSN(C2_tfrrp,"Pd4=Rs32",ATTRIBS(),
5957cf9345cSTaylor Simpson"Transfer general register to Predicate", { PdV = fGETUBYTE(0,RsV); })
5967cf9345cSTaylor Simpson
5977cf9345cSTaylor SimpsonQ6INSN(C4_fastcorner9,"Pd4=fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
5987cf9345cSTaylor Simpson"Determine whether the predicate sources define a corner",
5997cf9345cSTaylor Simpson{
6007cf9345cSTaylor Simpson    fHIDE(size4u_t tmp = 0; size4u_t i;)
6017cf9345cSTaylor Simpson    fSETHALF(0,tmp,(PsV<<8)|PtV);
6027cf9345cSTaylor Simpson    fSETHALF(1,tmp,(PsV<<8)|PtV);
6037cf9345cSTaylor Simpson    for (i = 1; i < 9; i++) {
6047cf9345cSTaylor Simpson        tmp &= tmp >> 1;
6057cf9345cSTaylor Simpson    }
6067cf9345cSTaylor Simpson    PdV = f8BITSOF(tmp != 0);
6077cf9345cSTaylor Simpson})
6087cf9345cSTaylor Simpson
6097cf9345cSTaylor SimpsonQ6INSN(C4_fastcorner9_not,"Pd4=!fastcorner9(Ps4,Pt4)",ATTRIBS(A_CRSLOT23),
6107cf9345cSTaylor Simpson"Determine whether the predicate sources define a corner",
6117cf9345cSTaylor Simpson{
6127cf9345cSTaylor Simpson    fHIDE(size4u_t tmp = 0; size4u_t i;)
6137cf9345cSTaylor Simpson    fSETHALF(0,tmp,(PsV<<8)|PtV);
6147cf9345cSTaylor Simpson    fSETHALF(1,tmp,(PsV<<8)|PtV);
6157cf9345cSTaylor Simpson    for (i = 1; i < 9; i++) {
6167cf9345cSTaylor Simpson        tmp &= tmp >> 1;
6177cf9345cSTaylor Simpson    }
6187cf9345cSTaylor Simpson    PdV = f8BITSOF(tmp == 0);
6197cf9345cSTaylor Simpson})
620