xref: /qemu/target/hexagon/imported/branch.idef (revision 59958d89)
17cf9345cSTaylor Simpson/*
259958d89STaylor Simpson *  Copyright(c) 2019-2023 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/*********************************************/
207cf9345cSTaylor Simpson/* Jump instructions                         */
217cf9345cSTaylor Simpson/*********************************************/
227cf9345cSTaylor Simpson
237cf9345cSTaylor Simpson#define A_JDIR A_JUMP
247cf9345cSTaylor Simpson#define A_CJNEWDIR A_JUMP
257cf9345cSTaylor Simpson#define A_CJOLDDIR A_JUMP
267cf9345cSTaylor Simpson#define A_NEWVALUEJ A_JUMP,A_DOTNEWVALUE,A_MEMLIKE_PACKET_RULES
277cf9345cSTaylor Simpson#define A_JINDIR A_JUMP,A_INDIRECT
287cf9345cSTaylor Simpson#define A_JINDIRNEW A_JUMP,A_INDIRECT
297cf9345cSTaylor Simpson#define A_JINDIROLD A_JUMP,A_INDIRECT
307cf9345cSTaylor Simpson
317cf9345cSTaylor SimpsonQ6INSN(J2_jump,"jump #r22:2",ATTRIBS(A_JDIR), "direct unconditional jump",
327cf9345cSTaylor Simpson{fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);})
337cf9345cSTaylor Simpson
347cf9345cSTaylor SimpsonQ6INSN(J2_jumpr,"jumpr Rs32",ATTRIBS(A_JINDIR), "indirect unconditional jump",
357cf9345cSTaylor Simpson{fJUMPR(RsN,RsV,COF_TYPE_JUMPR);})
367cf9345cSTaylor Simpson
3759958d89STaylor SimpsonQ6INSN(J2_jumprh,"jumprh Rs32",ATTRIBS(A_JINDIR, A_HINTED_COF), "indirect unconditional jump",
3859958d89STaylor Simpson{fJUMPR(RsN,RsV,COF_TYPE_JUMPR);})
3959958d89STaylor Simpson
407cf9345cSTaylor Simpson#define OLDCOND_JUMP(TAG,OPER,OPER2,ATTRIB,DESCR,SEMANTICS) \
417cf9345cSTaylor SimpsonQ6INSN(TAG##t,"if (Pu4) "OPER":nt "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBOLD(PuV),,SPECULATE_NOT_TAKEN,12,0); if (fLSBOLD(PuV)) { SEMANTICS; }}) \
427cf9345cSTaylor SimpsonQ6INSN(TAG##f,"if (!Pu4) "OPER":nt "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBOLDNOT(PuV),,SPECULATE_NOT_TAKEN,12,0); if (fLSBOLDNOT(PuV)) { SEMANTICS; }}) \
437cf9345cSTaylor SimpsonQ6INSN(TAG##tpt,"if (Pu4) "OPER":t "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBOLD(PuV),,SPECULATE_TAKEN,12,0); if (fLSBOLD(PuV)) { SEMANTICS; }}) \
447cf9345cSTaylor SimpsonQ6INSN(TAG##fpt,"if (!Pu4) "OPER":t "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBOLDNOT(PuV),,SPECULATE_TAKEN,12,0); if (fLSBOLDNOT(PuV)) { SEMANTICS; }})
457cf9345cSTaylor Simpson
467cf9345cSTaylor SimpsonOLDCOND_JUMP(J2_jump,"jump","#r15:2",ATTRIBS(A_CJOLDDIR),"direct conditional jump",
477cf9345cSTaylor SimpsonfIMMEXT(riV);fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);)
487cf9345cSTaylor Simpson
497cf9345cSTaylor SimpsonOLDCOND_JUMP(J2_jumpr,"jumpr","Rs32",ATTRIBS(A_JINDIROLD),"indirect conditional jump",
507cf9345cSTaylor SimpsonfJUMPR(RsN,RsV,COF_TYPE_JUMPR);)
517cf9345cSTaylor Simpson
527cf9345cSTaylor Simpson#define NEWCOND_JUMP(TAG,OPER,OPER2,ATTRIB,DESCR,SEMANTICS)\
537cf9345cSTaylor SimpsonQ6INSN(TAG##tnew,"if (Pu4.new) "OPER":nt "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBNEW(PuN),, SPECULATE_NOT_TAKEN , 12,0)} {if(fLSBNEW(PuN)){SEMANTICS;}})\
547cf9345cSTaylor SimpsonQ6INSN(TAG##fnew,"if (!Pu4.new) "OPER":nt "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBNEWNOT(PuN),, SPECULATE_NOT_TAKEN , 12,0)} {if(fLSBNEWNOT(PuN)){SEMANTICS;}})\
557cf9345cSTaylor SimpsonQ6INSN(TAG##tnewpt,"if (Pu4.new) "OPER":t "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBNEW(PuN),, SPECULATE_TAKEN , 12,0)} {if(fLSBNEW(PuN)){SEMANTICS;}})\
567cf9345cSTaylor SimpsonQ6INSN(TAG##fnewpt,"if (!Pu4.new) "OPER":t "OPER2,ATTRIB,DESCR,{fBRANCH_SPECULATE_STALL(fLSBNEWNOT(PuN),, SPECULATE_TAKEN , 12,0)} {if(fLSBNEWNOT(PuN)){SEMANTICS;}})
577cf9345cSTaylor Simpson
587cf9345cSTaylor SimpsonNEWCOND_JUMP(J2_jump,"jump","#r15:2",ATTRIBS(A_CJNEWDIR,A_ARCHV2),"direct conditional jump",
597cf9345cSTaylor SimpsonfIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMPNEW);)
607cf9345cSTaylor Simpson
617cf9345cSTaylor SimpsonNEWCOND_JUMP(J2_jumpr,"jumpr","Rs32",ATTRIBS(A_JINDIRNEW,A_ARCHV3),"indirect conditional jump",
627cf9345cSTaylor SimpsonfJUMPR(RsN,RsV,COF_TYPE_JUMPR);)
637cf9345cSTaylor Simpson
647cf9345cSTaylor Simpson
657cf9345cSTaylor Simpson
667cf9345cSTaylor SimpsonQ6INSN(J4_hintjumpr,"hintjr(Rs32)",ATTRIBS(A_JINDIR),"hint indirect conditional jump",
677cf9345cSTaylor Simpson{fHINTJR(RsV);})
687cf9345cSTaylor Simpson
697cf9345cSTaylor Simpson
707cf9345cSTaylor Simpson/*********************************************/
717cf9345cSTaylor Simpson/* Compound Compare-Jumps                    */
727cf9345cSTaylor Simpson/*********************************************/
737cf9345cSTaylor SimpsonQ6INSN(J2_jumprz,"if (Rs32!=#0) jump:nt #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register true",
747cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV!=0), , SPECULATE_NOT_TAKEN,12,0) if (RsV != 0) { fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
757cf9345cSTaylor Simpson
767cf9345cSTaylor SimpsonQ6INSN(J2_jumprnz,"if (Rs32==#0) jump:nt #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register false",
777cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV==0), , SPECULATE_NOT_TAKEN,12,0) if (RsV == 0) {fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
787cf9345cSTaylor Simpson
797cf9345cSTaylor SimpsonQ6INSN(J2_jumprzpt,"if (Rs32!=#0) jump:t #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register true",
807cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV!=0), , SPECULATE_TAKEN,12,0) if (RsV != 0) { fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
817cf9345cSTaylor Simpson
827cf9345cSTaylor SimpsonQ6INSN(J2_jumprnzpt,"if (Rs32==#0) jump:t #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register false",
837cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV==0), , SPECULATE_TAKEN,12,0) if (RsV == 0) {fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
847cf9345cSTaylor Simpson
857cf9345cSTaylor SimpsonQ6INSN(J2_jumprgtez,"if (Rs32>=#0) jump:nt #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register greater or equal to zero",
867cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV>=0), , SPECULATE_NOT_TAKEN,12,0) if (RsV>=0) { fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
877cf9345cSTaylor Simpson
887cf9345cSTaylor SimpsonQ6INSN(J2_jumprgtezpt,"if (Rs32>=#0) jump:t #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register greater or equal to zero",
897cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV>=0), , SPECULATE_TAKEN,12,0) if (RsV>=0) { fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
907cf9345cSTaylor Simpson
917cf9345cSTaylor SimpsonQ6INSN(J2_jumprltez,"if (Rs32<=#0) jump:nt #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register less than or equal to zero",
927cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV<=0), , SPECULATE_NOT_TAKEN,12,0) if (RsV<=0) { fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
937cf9345cSTaylor Simpson
947cf9345cSTaylor SimpsonQ6INSN(J2_jumprltezpt,"if (Rs32<=#0) jump:t #r13:2",ATTRIBS(A_CJNEWDIR,A_ARCHV3),"direct conditional jump if register less than or equal to zero",
957cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL((RsV<=0), , SPECULATE_TAKEN,12,0) if (RsV<=0) { fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
967cf9345cSTaylor Simpson
977cf9345cSTaylor Simpson
987cf9345cSTaylor Simpson
997cf9345cSTaylor Simpson/*********************************************/
1007cf9345cSTaylor Simpson/* V4 Compound Compare-Jumps                 */
1017cf9345cSTaylor Simpson/*********************************************/
1027cf9345cSTaylor Simpson
1037cf9345cSTaylor Simpson
1047cf9345cSTaylor Simpson/* V4 compound compare jumps (CJ) */
1057cf9345cSTaylor Simpson#define STD_CMPJUMP(TAG,TST,TSTSEM)\
1067cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_tp0_jump_nt, "p0="TST"; if (p0.new) jump:nt #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump", {fPART1(fWRITE_P0(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW0,,SPECULATE_NOT_TAKEN,13,0)  if (fLSBNEW0) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1077cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_fp0_jump_nt, "p0="TST"; if (!p0.new) jump:nt #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump",{fPART1(fWRITE_P0(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW0NOT,,SPECULATE_NOT_TAKEN,13,0) if (fLSBNEW0NOT) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1087cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_tp0_jump_t,  "p0="TST"; if (p0.new) jump:t #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump",  {fPART1(fWRITE_P0(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW0,,SPECULATE_TAKEN,13,0)      if (fLSBNEW0) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1097cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_fp0_jump_t,  "p0="TST"; if (!p0.new) jump:t #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump", {fPART1(fWRITE_P0(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW0NOT,,SPECULATE_TAKEN,13,0)     if (fLSBNEW0NOT) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1107cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_tp1_jump_nt, "p1="TST"; if (p1.new) jump:nt #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump", {fPART1(fWRITE_P1(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW1,,SPECULATE_NOT_TAKEN,13,0)  if (fLSBNEW1) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1117cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_fp1_jump_nt, "p1="TST"; if (!p1.new) jump:nt #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump",{fPART1(fWRITE_P1(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW1NOT,,SPECULATE_NOT_TAKEN,13,0) if (fLSBNEW1NOT) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1127cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_tp1_jump_t,  "p1="TST"; if (p1.new) jump:t #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump",  {fPART1(fWRITE_P1(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW1,,SPECULATE_TAKEN,13,0)      if (fLSBNEW1) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1137cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_fp1_jump_t,  "p1="TST"; if (!p1.new) jump:t #r9:2", ATTRIBS(A_CJNEWDIR,A_NEWCMPJUMP),"compound compare-jump", {fPART1(fWRITE_P1(f8BITSOF(TSTSEM)))  fBRANCH_SPECULATE_STALL(fLSBNEW1NOT,,SPECULATE_TAKEN,13,0)     if (fLSBNEW1NOT) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
1147cf9345cSTaylor Simpson
1157cf9345cSTaylor Simpson
1167cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpeqi,"cmp.eq(Rs16,#U5)",(RsV==UiV))
1177cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpgti,"cmp.gt(Rs16,#U5)",(RsV>UiV))
1187cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpgtui,"cmp.gtu(Rs16,#U5)",(fCAST4u(RsV)>UiV))
1197cf9345cSTaylor Simpson
1207cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpeqn1,"cmp.eq(Rs16,#-1)",(RsV==-1))
1217cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpgtn1,"cmp.gt(Rs16,#-1)",(RsV>-1))
1227cf9345cSTaylor SimpsonSTD_CMPJUMP(tstbit0,"tstbit(Rs16,#0)",(RsV & 1))
1237cf9345cSTaylor Simpson
1247cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpeq,"cmp.eq(Rs16,Rt16)",(RsV==RtV))
1257cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpgt,"cmp.gt(Rs16,Rt16)",(RsV>RtV))
1267cf9345cSTaylor SimpsonSTD_CMPJUMP(cmpgtu,"cmp.gtu(Rs16,Rt16)",(fCAST4u(RsV)>RtV))
1277cf9345cSTaylor Simpson
1287cf9345cSTaylor Simpson
1297cf9345cSTaylor Simpson
1307cf9345cSTaylor Simpson/* V4 jump and transfer (CJ) */
1317cf9345cSTaylor SimpsonQ6INSN(J4_jumpseti,"Rd16=#U6 ; jump #r9:2",ATTRIBS(A_JDIR), "direct unconditional jump and set register to immediate",
1327cf9345cSTaylor Simpson{fIMMEXT(riV); fPCALIGN(riV); RdV=UiV; fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);})
1337cf9345cSTaylor Simpson
1347cf9345cSTaylor SimpsonQ6INSN(J4_jumpsetr,"Rd16=Rs16 ; jump #r9:2",ATTRIBS(A_JDIR), "direct unconditional jump and transfer register",
1357cf9345cSTaylor Simpson{fIMMEXT(riV); fPCALIGN(riV); RdV=RsV; fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);})
1367cf9345cSTaylor Simpson
1377cf9345cSTaylor Simpson
1387cf9345cSTaylor Simpson/* V4 new-value jumps (NCJ) */
1397cf9345cSTaylor Simpson#define STD_CMPJUMPNEWRS(TAG,TST,TSTSEM)\
1407cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_jumpnv_t, "if ("TST") jump:t #r9:2", ATTRIBS(A_NEWVALUEJ),"compound compare-jump",{fBRANCH_SPECULATE_STALL(TSTSEM,,SPECULATE_TAKEN,13,0);if (TSTSEM) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})\
1417cf9345cSTaylor SimpsonQ6INSN(J4_##TAG##_jumpnv_nt,"if ("TST") jump:nt #r9:2",ATTRIBS(A_NEWVALUEJ),"compound compare-jump",{fBRANCH_SPECULATE_STALL(TSTSEM,,SPECULATE_NOT_TAKEN,13,0); if (TSTSEM) {fIMMEXT(riV); fPCALIGN(riV); fBRANCH(fREAD_PC()+riV,COF_TYPE_JUMP);}})
1427cf9345cSTaylor Simpson
1437cf9345cSTaylor Simpson
1447cf9345cSTaylor Simpson
1457cf9345cSTaylor Simpson
1467cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpeqi_t,"cmp.eq(Ns8.new,#U5)",(fNEWREG(NsN)==(UiV)))
1477cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpeqi_f,"!cmp.eq(Ns8.new,#U5)",(fNEWREG(NsN)!=(UiV)))
1487cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgti_t,"cmp.gt(Ns8.new,#U5)",(fNEWREG(NsN)>(UiV)))
1497cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgti_f,"!cmp.gt(Ns8.new,#U5)",!(fNEWREG(NsN)>(UiV)))
1507cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgtui_t,"cmp.gtu(Ns8.new,#U5)",(fCAST4u(fNEWREG(NsN))>(UiV)))
1517cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgtui_f,"!cmp.gtu(Ns8.new,#U5)",!(fCAST4u(fNEWREG(NsN))>(UiV)))
1527cf9345cSTaylor Simpson
1537cf9345cSTaylor Simpson
1547cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpeqn1_t,"cmp.eq(Ns8.new,#-1)",(fNEWREG(NsN)==(-1)))
1557cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpeqn1_f,"!cmp.eq(Ns8.new,#-1)",(fNEWREG(NsN)!=(-1)))
1567cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgtn1_t,"cmp.gt(Ns8.new,#-1)",(fNEWREG(NsN)>(-1)))
1577cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgtn1_f,"!cmp.gt(Ns8.new,#-1)",!(fNEWREG(NsN)>(-1)))
1587cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(tstbit0_t,"tstbit(Ns8.new,#0)",((fNEWREG(NsN)) & 1))
1597cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(tstbit0_f,"!tstbit(Ns8.new,#0)",!((fNEWREG(NsN)) & 1))
1607cf9345cSTaylor Simpson
1617cf9345cSTaylor Simpson
1627cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpeq_t, "cmp.eq(Ns8.new,Rt32)", (fNEWREG(NsN)==RtV))
1637cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgt_t, "cmp.gt(Ns8.new,Rt32)", (fNEWREG(NsN)>RtV))
1647cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgtu_t,"cmp.gtu(Ns8.new,Rt32)",(fCAST4u(fNEWREG(NsN))>fCAST4u(RtV)))
1657cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmplt_t, "cmp.gt(Rt32,Ns8.new)", (RtV>fNEWREG(NsN)))
1667cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpltu_t,"cmp.gtu(Rt32,Ns8.new)",(fCAST4u(RtV)>fCAST4u(fNEWREG(NsN))))
1677cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpeq_f, "!cmp.eq(Ns8.new,Rt32)", (fNEWREG(NsN)!=RtV))
1687cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgt_f, "!cmp.gt(Ns8.new,Rt32)", !(fNEWREG(NsN)>RtV))
1697cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpgtu_f,"!cmp.gtu(Ns8.new,Rt32)",!(fCAST4u(fNEWREG(NsN))>fCAST4u(RtV)))
1707cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmplt_f, "!cmp.gt(Rt32,Ns8.new)", !(RtV>fNEWREG(NsN)))
1717cf9345cSTaylor SimpsonSTD_CMPJUMPNEWRS(cmpltu_f,"!cmp.gtu(Rt32,Ns8.new)",!(fCAST4u(RtV)>fCAST4u(fNEWREG(NsN))))
1727cf9345cSTaylor Simpson
1737cf9345cSTaylor Simpson
1747cf9345cSTaylor Simpson
1757cf9345cSTaylor Simpson
1767cf9345cSTaylor Simpson
1777cf9345cSTaylor Simpson/*********************************************/
1787cf9345cSTaylor Simpson/* Subroutine Call instructions              */
1797cf9345cSTaylor Simpson/*********************************************/
1807cf9345cSTaylor Simpson
1817cf9345cSTaylor Simpson#define CDIR_STD   A_CALL
1827cf9345cSTaylor Simpson#define CINDIR_STD A_CALL,A_INDIRECT
1837cf9345cSTaylor Simpson
1847cf9345cSTaylor SimpsonQ6INSN(J2_call,"call #r22:2",ATTRIBS(CDIR_STD), "direct unconditional call",
1857cf9345cSTaylor Simpson{fIMMEXT(riV); fPCALIGN(riV); fCALL(fREAD_PC()+riV); })
1867cf9345cSTaylor Simpson
1877cf9345cSTaylor SimpsonQ6INSN(J2_callt,"if (Pu4) call #r15:2",ATTRIBS(CDIR_STD),"direct conditional call if true",
1887cf9345cSTaylor Simpson{fIMMEXT(riV); fPCALIGN(riV); fBRANCH_SPECULATE_STALL(fLSBOLD(PuV),,SPECULATE_NOT_TAKEN,12,0); if (fLSBOLD(PuV)) { fCALL(fREAD_PC()+riV); }})
1897cf9345cSTaylor Simpson
1907cf9345cSTaylor SimpsonQ6INSN(J2_callf,"if (!Pu4) call #r15:2",ATTRIBS(CDIR_STD),"direct conditional call if false",
1917cf9345cSTaylor Simpson{fIMMEXT(riV); fPCALIGN(riV); fBRANCH_SPECULATE_STALL(fLSBOLDNOT(PuV),,SPECULATE_NOT_TAKEN,12,0);if (fLSBOLDNOT(PuV)) { fCALL(fREAD_PC()+riV); }})
1927cf9345cSTaylor Simpson
1937cf9345cSTaylor SimpsonQ6INSN(J2_callr,"callr Rs32",ATTRIBS(CINDIR_STD), "indirect unconditional call",
1947cf9345cSTaylor Simpson{ fCALLR(RsV); })
1957cf9345cSTaylor Simpson
1967cf9345cSTaylor SimpsonQ6INSN(J2_callrt,"if (Pu4) callr Rs32",ATTRIBS(CINDIR_STD),"indirect conditional call if true",
1977cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL(fLSBOLD(PuV),,SPECULATE_NOT_TAKEN,12,0);if (fLSBOLD(PuV)) { fCALLR(RsV); }})
1987cf9345cSTaylor Simpson
1997cf9345cSTaylor SimpsonQ6INSN(J2_callrf,"if (!Pu4) callr Rs32",ATTRIBS(CINDIR_STD),"indirect conditional call if false",
2007cf9345cSTaylor Simpson{fBRANCH_SPECULATE_STALL(fLSBOLDNOT(PuV),,SPECULATE_NOT_TAKEN,12,0);if (fLSBOLDNOT(PuV)) { fCALLR(RsV); }})
2017cf9345cSTaylor Simpson
20259958d89STaylor SimpsonQ6INSN(J2_callrh,"callrh Rs32",ATTRIBS(CINDIR_STD, A_HINTED_COF), "hinted indirect unconditional call",
20359958d89STaylor Simpson{ fCALLR(RsV); })
2047cf9345cSTaylor Simpson
2057cf9345cSTaylor Simpson
2067cf9345cSTaylor Simpson
2077cf9345cSTaylor Simpson/*********************************************/
2087cf9345cSTaylor Simpson/* HW Loop instructions                      */
2097cf9345cSTaylor Simpson/*********************************************/
2107cf9345cSTaylor Simpson
2117cf9345cSTaylor SimpsonQ6INSN(J2_loop0r,"loop0(#r7:2,Rs32)",ATTRIBS(),"Initialize HW loop 0",
2127cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2137cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, RsV);
2147cf9345cSTaylor Simpson  fSET_LPCFG(0);
2157cf9345cSTaylor Simpson})
2167cf9345cSTaylor Simpson
2177cf9345cSTaylor SimpsonQ6INSN(J2_loop1r,"loop1(#r7:2,Rs32)",ATTRIBS(),"Initialize HW loop 1",
2187cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2197cf9345cSTaylor Simpson  fWRITE_LOOP_REGS1(/*sa,lc*/ fREAD_PC()+riV, RsV);
2207cf9345cSTaylor Simpson})
2217cf9345cSTaylor Simpson
2227cf9345cSTaylor SimpsonQ6INSN(J2_loop0i,"loop0(#r7:2,#U10)",ATTRIBS(),"Initialize HW loop 0",
2237cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2247cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, UiV);
2257cf9345cSTaylor Simpson  fSET_LPCFG(0);
2267cf9345cSTaylor Simpson})
2277cf9345cSTaylor Simpson
2287cf9345cSTaylor SimpsonQ6INSN(J2_loop1i,"loop1(#r7:2,#U10)",ATTRIBS(),"Initialize HW loop 1",
2297cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2307cf9345cSTaylor Simpson  fWRITE_LOOP_REGS1(/*sa,lc*/ fREAD_PC()+riV, UiV);
2317cf9345cSTaylor Simpson})
2327cf9345cSTaylor Simpson
2337cf9345cSTaylor Simpson
2347cf9345cSTaylor SimpsonQ6INSN(J2_ploop1sr,"p3=sp1loop0(#r7:2,Rs32)",ATTRIBS(A_ARCHV2),"Initialize HW loop 0",
2357cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2367cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, RsV);
2377cf9345cSTaylor Simpson  fSET_LPCFG(1);
2387cf9345cSTaylor Simpson  fWRITE_P3(0);
2397cf9345cSTaylor Simpson})
2407cf9345cSTaylor SimpsonQ6INSN(J2_ploop1si,"p3=sp1loop0(#r7:2,#U10)",ATTRIBS(A_ARCHV2),"Initialize HW loop 0",
2417cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2427cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, UiV);
2437cf9345cSTaylor Simpson  fSET_LPCFG(1);
2447cf9345cSTaylor Simpson  fWRITE_P3(0);
2457cf9345cSTaylor Simpson})
2467cf9345cSTaylor Simpson
2477cf9345cSTaylor SimpsonQ6INSN(J2_ploop2sr,"p3=sp2loop0(#r7:2,Rs32)",ATTRIBS(A_ARCHV2),"Initialize HW loop 0",
2487cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2497cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, RsV);
2507cf9345cSTaylor Simpson  fSET_LPCFG(2);
2517cf9345cSTaylor Simpson  fWRITE_P3(0);
2527cf9345cSTaylor Simpson})
2537cf9345cSTaylor SimpsonQ6INSN(J2_ploop2si,"p3=sp2loop0(#r7:2,#U10)",ATTRIBS(A_ARCHV2),"Initialize HW loop 0",
2547cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2557cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, UiV);
2567cf9345cSTaylor Simpson  fSET_LPCFG(2);
2577cf9345cSTaylor Simpson  fWRITE_P3(0);
2587cf9345cSTaylor Simpson})
2597cf9345cSTaylor Simpson
2607cf9345cSTaylor SimpsonQ6INSN(J2_ploop3sr,"p3=sp3loop0(#r7:2,Rs32)",ATTRIBS(A_ARCHV2),"Initialize HW loop 0",
2617cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2627cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, RsV);
2637cf9345cSTaylor Simpson  fSET_LPCFG(3);
2647cf9345cSTaylor Simpson  fWRITE_P3(0);
2657cf9345cSTaylor Simpson})
2667cf9345cSTaylor SimpsonQ6INSN(J2_ploop3si,"p3=sp3loop0(#r7:2,#U10)",ATTRIBS(A_ARCHV2),"Initialize HW loop 0",
2677cf9345cSTaylor Simpson{ fIMMEXT(riV); fPCALIGN(riV);
2687cf9345cSTaylor Simpson  fWRITE_LOOP_REGS0(/*sa,lc*/ fREAD_PC()+riV, UiV);
2697cf9345cSTaylor Simpson  fSET_LPCFG(3);
2707cf9345cSTaylor Simpson  fWRITE_P3(0);
2717cf9345cSTaylor Simpson})
2727cf9345cSTaylor Simpson
2737cf9345cSTaylor Simpson
2747cf9345cSTaylor Simpson
2757cf9345cSTaylor SimpsonQ6INSN(J2_endloop01,"endloop01",ATTRIBS(A_HWLOOP0_END,A_HWLOOP1_END),"Loopend for inner and outer loop",
2767cf9345cSTaylor Simpson{
2777cf9345cSTaylor Simpson
2787cf9345cSTaylor Simpson  /* V2: With predicate control */
2797cf9345cSTaylor Simpson  if (fGET_LPCFG) {
2807cf9345cSTaylor Simpson    fHIDE( if (fGET_LPCFG >= 2) { /* Nothing */ } else )
2817cf9345cSTaylor Simpson    if (fGET_LPCFG==1) {
2827cf9345cSTaylor Simpson       fWRITE_P3(0xff);
2837cf9345cSTaylor Simpson    }
2847cf9345cSTaylor Simpson    fSET_LPCFG(fGET_LPCFG-1);
2857cf9345cSTaylor Simpson  }
2867cf9345cSTaylor Simpson
2877cf9345cSTaylor Simpson  /* check if iterate */
2887cf9345cSTaylor Simpson  if (fREAD_LC0>1) {
2897cf9345cSTaylor Simpson    fBRANCH(fREAD_SA0,COF_TYPE_LOOPEND0);
2907cf9345cSTaylor Simpson    /* decrement loop count */
2917cf9345cSTaylor Simpson    fWRITE_LC0(fREAD_LC0-1);
2927cf9345cSTaylor Simpson  } else {
2937cf9345cSTaylor Simpson    /* check if iterate */
2947cf9345cSTaylor Simpson    if (fREAD_LC1>1) {
2957cf9345cSTaylor Simpson      fBRANCH(fREAD_SA1,COF_TYPE_LOOPEND1);
2967cf9345cSTaylor Simpson      /* decrement loop count */
2977cf9345cSTaylor Simpson      fWRITE_LC1(fREAD_LC1-1);
2987cf9345cSTaylor Simpson    }
2997cf9345cSTaylor Simpson  }
3007cf9345cSTaylor Simpson
3017cf9345cSTaylor Simpson})
3027cf9345cSTaylor Simpson
3037cf9345cSTaylor SimpsonQ6INSN(J2_endloop0,"endloop0",ATTRIBS(A_HWLOOP0_END),"Loopend for inner loop",
3047cf9345cSTaylor Simpson{
3057cf9345cSTaylor Simpson
3067cf9345cSTaylor Simpson  /* V2: With predicate control */
3077cf9345cSTaylor Simpson  if (fGET_LPCFG) {
3087cf9345cSTaylor Simpson    fHIDE( if (fGET_LPCFG >= 2) { /* Nothing */ } else )
3097cf9345cSTaylor Simpson    if (fGET_LPCFG==1) {
3107cf9345cSTaylor Simpson       fWRITE_P3(0xff);
3117cf9345cSTaylor Simpson    }
3127cf9345cSTaylor Simpson    fSET_LPCFG(fGET_LPCFG-1);
3137cf9345cSTaylor Simpson  }
3147cf9345cSTaylor Simpson
3157cf9345cSTaylor Simpson  /* check if iterate */
3167cf9345cSTaylor Simpson  if (fREAD_LC0>1) {
3177cf9345cSTaylor Simpson    fBRANCH(fREAD_SA0,COF_TYPE_LOOPEND0);
3187cf9345cSTaylor Simpson    /* decrement loop count */
3197cf9345cSTaylor Simpson    fWRITE_LC0(fREAD_LC0-1);
3207cf9345cSTaylor Simpson  }
3217cf9345cSTaylor Simpson})
3227cf9345cSTaylor Simpson
3237cf9345cSTaylor SimpsonQ6INSN(J2_endloop1,"endloop1",ATTRIBS(A_HWLOOP1_END),"Loopend for outer loop",
3247cf9345cSTaylor Simpson{
3257cf9345cSTaylor Simpson  /* check if iterate */
3267cf9345cSTaylor Simpson  if (fREAD_LC1>1) {
3277cf9345cSTaylor Simpson    fBRANCH(fREAD_SA1,COF_TYPE_LOOPEND1);
3287cf9345cSTaylor Simpson    /* decrement loop count */
3297cf9345cSTaylor Simpson    fWRITE_LC1(fREAD_LC1-1);
3307cf9345cSTaylor Simpson  }
3317cf9345cSTaylor Simpson})
332