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