17cf9345cSTaylor Simpson/* 2406c74f2STaylor 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 * Load and Store instruction definitions 207cf9345cSTaylor Simpson */ 217cf9345cSTaylor Simpson 227cf9345cSTaylor Simpson/* The set of addressing modes standard to all Load instructions */ 237cf9345cSTaylor Simpson#define STD_LD_AMODES(TAG,OPER,DESCR,ATTRIB,SHFT,SEMANTICS,SCALE)\ 247cf9345cSTaylor SimpsonQ6INSN(L2_##TAG##_io, OPER"(Rs32+#s11:"SHFT")", ATTRIB,DESCR,{fIMMEXT(siV); fEA_RI(RsV,siV); SEMANTICS; })\ 257cf9345cSTaylor SimpsonQ6INSN(L4_##TAG##_ur, OPER"(Rt32<<#u2+#U6)", ATTRIB,DESCR,{fMUST_IMMEXT(UiV); fEA_IRs(UiV,RtV,uiV); SEMANTICS;})\ 267cf9345cSTaylor SimpsonQ6INSN(L4_##TAG##_ap, OPER"(Re32=#U6)", ATTRIB,DESCR,{fMUST_IMMEXT(UiV); fEA_IMM(UiV); SEMANTICS; ReV=UiV; })\ 277cf9345cSTaylor SimpsonQ6INSN(L2_##TAG##_pr, OPER"(Rx32++Mu2)", ATTRIB,DESCR,{fEA_REG(RxV); fPM_M(RxV,MuV); SEMANTICS;})\ 28af7f1821STaylor SimpsonQ6INSN(L2_##TAG##_pbr, OPER"(Rx32++Mu2:brev)", ATTRIB,DESCR,{fEA_BREVR(RxV); fPM_M(RxV,MuV); SEMANTICS;})\ 297cf9345cSTaylor SimpsonQ6INSN(L2_##TAG##_pi, OPER"(Rx32++#s4:"SHFT")", ATTRIB,DESCR,{fEA_REG(RxV); fPM_I(RxV,siV); SEMANTICS;})\ 3046ef47e2STaylor SimpsonQ6INSN(L2_##TAG##_pci, OPER"(Rx32++#s4:"SHFT":circ(Mu2))",ATTRIB,DESCR,{fEA_REG(RxV); fPM_CIRI(RxV,siV,MuV); SEMANTICS;})\ 3146ef47e2STaylor SimpsonQ6INSN(L2_##TAG##_pcr, OPER"(Rx32++I:circ(Mu2))", ATTRIB,DESCR,{fEA_REG(RxV); fPM_CIRR(RxV,fREAD_IREG(MuV)<<SCALE,MuV); SEMANTICS;}) 327cf9345cSTaylor Simpson 337cf9345cSTaylor Simpson/* The set of 32-bit load instructions */ 34b772528aSTaylor SimpsonSTD_LD_AMODES(loadrub,"Rd32=memub","Load Unsigned Byte",ATTRIBS(A_MEMSIZE_1B,A_LOAD,A_REGWRSIZE_1B),"0",fLOAD(1,1,u,EA,RdV),0) 35b772528aSTaylor SimpsonSTD_LD_AMODES(loadrb, "Rd32=memb", "Load signed Byte",ATTRIBS(A_MEMSIZE_1B,A_LOAD),"0",fLOAD(1,1,s,EA,RdV),0) 36b772528aSTaylor SimpsonSTD_LD_AMODES(loadruh,"Rd32=memuh","Load unsigned Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_LOAD),"1",fLOAD(1,2,u,EA,RdV),1) 37b772528aSTaylor SimpsonSTD_LD_AMODES(loadrh, "Rd32=memh", "Load signed Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_LOAD),"1",fLOAD(1,2,s,EA,RdV),1) 38b772528aSTaylor SimpsonSTD_LD_AMODES(loadri, "Rd32=memw", "Load Word",ATTRIBS(A_REGWRSIZE_4B,A_MEMSIZE_4B,A_LOAD),"2",fLOAD(1,4,u,EA,RdV),2) 39b772528aSTaylor SimpsonSTD_LD_AMODES(loadrd, "Rdd32=memd","Load Double integer",ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_LOAD),"3",fLOAD(1,8,u,EA,RddV),3) 407cf9345cSTaylor Simpson 410d0b91a8STaylor Simpson/* These instructions do a load an unpack */ 420d0b91a8STaylor SimpsonSTD_LD_AMODES(loadbzw2, "Rd32=memubh", "Load Bytes and Vector Zero-Extend (unpack)", 430d0b91a8STaylor SimpsonATTRIBS(A_LOAD),"1", 440d0b91a8STaylor Simpson{fHIDE(size2u_t tmpV; int i;) 450d0b91a8STaylor Simpson fLOAD(1,2,u,EA,tmpV); 460d0b91a8STaylor Simpson for (i=0;i<2;i++) { 470d0b91a8STaylor Simpson fSETHALF(i,RdV,fGETUBYTE(i,tmpV)); 480d0b91a8STaylor Simpson } 490d0b91a8STaylor Simpson},1) 500d0b91a8STaylor Simpson 510d0b91a8STaylor SimpsonSTD_LD_AMODES(loadbzw4, "Rdd32=memubh", "Load Bytes and Vector Zero-Extend (unpack)", 520d0b91a8STaylor SimpsonATTRIBS(A_LOAD),"2", 530d0b91a8STaylor Simpson{fHIDE(size4u_t tmpV; int i;) 540d0b91a8STaylor Simpson fLOAD(1,4,u,EA,tmpV); 550d0b91a8STaylor Simpson for (i=0;i<4;i++) { 560d0b91a8STaylor Simpson fSETHALF(i,RddV,fGETUBYTE(i,tmpV)); 570d0b91a8STaylor Simpson } 580d0b91a8STaylor Simpson},2) 590d0b91a8STaylor Simpson 600d0b91a8STaylor Simpson 610d0b91a8STaylor Simpson 620d0b91a8STaylor Simpson/* These instructions do a load an unpack */ 630d0b91a8STaylor SimpsonSTD_LD_AMODES(loadbsw2, "Rd32=membh", "Load Bytes and Vector Sign-Extend (unpack)", 640d0b91a8STaylor SimpsonATTRIBS(A_LOAD),"1", 650d0b91a8STaylor Simpson{fHIDE(size2u_t tmpV; int i;) 660d0b91a8STaylor Simpson fLOAD(1,2,u,EA,tmpV); 670d0b91a8STaylor Simpson for (i=0;i<2;i++) { 680d0b91a8STaylor Simpson fSETHALF(i,RdV,fGETBYTE(i,tmpV)); 690d0b91a8STaylor Simpson } 700d0b91a8STaylor Simpson},1) 710d0b91a8STaylor Simpson 720d0b91a8STaylor SimpsonSTD_LD_AMODES(loadbsw4, "Rdd32=membh", "Load Bytes and Vector Sign-Extend (unpack)", 730d0b91a8STaylor SimpsonATTRIBS(A_LOAD),"2", 740d0b91a8STaylor Simpson{fHIDE(size4u_t tmpV; int i;) 750d0b91a8STaylor Simpson fLOAD(1,4,u,EA,tmpV); 760d0b91a8STaylor Simpson for (i=0;i<4;i++) { 770d0b91a8STaylor Simpson fSETHALF(i,RddV,fGETBYTE(i,tmpV)); 780d0b91a8STaylor Simpson } 790d0b91a8STaylor Simpson},2) 800d0b91a8STaylor Simpson 810d0b91a8STaylor Simpson 820d0b91a8STaylor Simpson 837aa9ffabSTaylor SimpsonSTD_LD_AMODES(loadalignh, "Ryy32=memh_fifo", "Load Half-word into shifted vector", 847aa9ffabSTaylor SimpsonATTRIBS(A_LOAD),"1", 857aa9ffabSTaylor Simpson{ 867aa9ffabSTaylor Simpson fHIDE(size8u_t tmpV;) 877aa9ffabSTaylor Simpson fLOAD(1,2,u,EA,tmpV); 887aa9ffabSTaylor Simpson RyyV = (((size8u_t)RyyV)>>16)|(tmpV<<48); 897aa9ffabSTaylor Simpson},1) 907aa9ffabSTaylor Simpson 917aa9ffabSTaylor Simpson 927aa9ffabSTaylor SimpsonSTD_LD_AMODES(loadalignb, "Ryy32=memb_fifo", "Load byte into shifted vector", 937aa9ffabSTaylor SimpsonATTRIBS(A_LOAD),"0", 947aa9ffabSTaylor Simpson{ 957aa9ffabSTaylor Simpson fHIDE(size8u_t tmpV;) 967aa9ffabSTaylor Simpson fLOAD(1,1,u,EA,tmpV); 977aa9ffabSTaylor Simpson RyyV = (((size8u_t)RyyV)>>8)|(tmpV<<56); 987aa9ffabSTaylor Simpson},0) 997aa9ffabSTaylor Simpson 1007aa9ffabSTaylor Simpson 1017aa9ffabSTaylor Simpson 1020d0b91a8STaylor Simpson 1037cf9345cSTaylor Simpson/* The set of addressing modes standard to all Store instructions */ 1047cf9345cSTaylor Simpson#define STD_ST_AMODES(TAG,DEST,OPER,DESCR,ATTRIB,SHFT,SEMANTICS,SCALE)\ 1057cf9345cSTaylor SimpsonQ6INSN(S2_##TAG##_io, OPER"(Rs32+#s11:"SHFT")="DEST, ATTRIB,DESCR,{fIMMEXT(siV); fEA_RI(RsV,siV); SEMANTICS; })\ 1067cf9345cSTaylor SimpsonQ6INSN(S2_##TAG##_pi, OPER"(Rx32++#s4:"SHFT")="DEST, ATTRIB,DESCR,{fEA_REG(RxV); fPM_I(RxV,siV); SEMANTICS; })\ 1077cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##_ap, OPER"(Re32=#U6)="DEST, ATTRIB,DESCR,{fMUST_IMMEXT(UiV); fEA_IMM(UiV); SEMANTICS; ReV=UiV; })\ 1087cf9345cSTaylor SimpsonQ6INSN(S2_##TAG##_pr, OPER"(Rx32++Mu2)="DEST, ATTRIB,DESCR,{fEA_REG(RxV); fPM_M(RxV,MuV); SEMANTICS; })\ 1097cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##_ur, OPER"(Ru32<<#u2+#U6)="DEST, ATTRIB,DESCR,{fMUST_IMMEXT(UiV); fEA_IRs(UiV,RuV,uiV); SEMANTICS;})\ 110af7f1821STaylor SimpsonQ6INSN(S2_##TAG##_pbr, OPER"(Rx32++Mu2:brev)="DEST, ATTRIB,DESCR,{fEA_BREVR(RxV); fPM_M(RxV,MuV); SEMANTICS; })\ 11146ef47e2STaylor SimpsonQ6INSN(S2_##TAG##_pci, OPER"(Rx32++#s4:"SHFT":circ(Mu2))="DEST, ATTRIB,DESCR,{fEA_REG(RxV); fPM_CIRI(RxV,siV,MuV); SEMANTICS;})\ 11246ef47e2STaylor SimpsonQ6INSN(S2_##TAG##_pcr, OPER"(Rx32++I:circ(Mu2))="DEST, ATTRIB,DESCR,{fEA_REG(RxV); fPM_CIRR(RxV,fREAD_IREG(MuV)<<SCALE,MuV); SEMANTICS;}) 1137cf9345cSTaylor Simpson 1147cf9345cSTaylor Simpson 1157cf9345cSTaylor Simpson/* The set of 32-bit store instructions */ 116b772528aSTaylor SimpsonSTD_ST_AMODES(storerb, "Rt32", "memb","Store Byte",ATTRIBS(A_MEMSIZE_1B,A_STORE),"0",fSTORE(1,1,EA,fGETBYTE(0,RtV)),0) 117b772528aSTaylor SimpsonSTD_ST_AMODES(storerh, "Rt32", "memh","Store Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_STORE),"1",fSTORE(1,2,EA,fGETHALF(0,RtV)),1) 118b772528aSTaylor SimpsonSTD_ST_AMODES(storerf, "Rt.H32", "memh","Store Upper Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_STORE),"1",fSTORE(1,2,EA,fGETHALF(1,RtV)),1) 119b772528aSTaylor SimpsonSTD_ST_AMODES(storeri, "Rt32", "memw","Store Word",ATTRIBS(A_REGWRSIZE_4B,A_MEMSIZE_4B,A_STORE),"2",fSTORE(1,4,EA,RtV),2) 120b772528aSTaylor SimpsonSTD_ST_AMODES(storerd, "Rtt32","memd","Store Double integer",ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_STORE),"3",fSTORE(1,8,EA,RttV),3) 121b772528aSTaylor SimpsonSTD_ST_AMODES(storerinew, "Nt8.new", "memw","Store Word",ATTRIBS(A_REGWRSIZE_4B,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_4B,A_STORE,A_RESTRICT_NOSLOT1_STORE),"2",fSTORE(1,4,EA,fNEWREG_ST(NtN)),2) 122b772528aSTaylor SimpsonSTD_ST_AMODES(storerbnew, "Nt8.new", "memb","Store Byte",ATTRIBS(A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_1B,A_STORE,A_RESTRICT_NOSLOT1_STORE),"0",fSTORE(1,1,EA,fGETBYTE(0,fNEWREG_ST(NtN))),0) 123b772528aSTaylor SimpsonSTD_ST_AMODES(storerhnew, "Nt8.new", "memh","Store Half integer",ATTRIBS(A_REGWRSIZE_2B,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_2B,A_STORE,A_RESTRICT_NOSLOT1_STORE),"1",fSTORE(1,2,EA,fGETHALF(0,fNEWREG_ST(NtN))),1) 1247cf9345cSTaylor Simpson 1257cf9345cSTaylor Simpson 126b772528aSTaylor SimpsonQ6INSN(S2_allocframe,"allocframe(Rx32,#u11:3):raw", ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_STORE,A_RESTRICT_SLOT0ONLY), "Allocate stack frame", 1277cf9345cSTaylor Simpson{ fEA_RI(RxV,-8); fSTORE(1,8,EA,fFRAME_SCRAMBLE((fCAST8_8u(fREAD_LR()) << 32) | fCAST4_4u(fREAD_FP()))); fWRITE_FP(EA); fFRAMECHECK(EA-uiV,EA); RxV = EA-uiV; }) 1287cf9345cSTaylor Simpson 129b772528aSTaylor Simpson#define A_RETURN A_RESTRICT_COF_MAX1,A_RESTRICT_SLOT0ONLY,A_RESTRICT_NOSLOT1_STORE,A_RET_TYPE,A_DEALLOCRET 1307cf9345cSTaylor Simpson 131406c74f2STaylor Simpson/**** Load Acquire Store Release Instructions****/ 132406c74f2STaylor Simpson 133406c74f2STaylor Simpson 134406c74f2STaylor Simpson 135406c74f2STaylor SimpsonQ6INSN(L2_loadw_aq,"Rd32=memw_aq(Rs32)",ATTRIBS(A_REGWRSIZE_4B,A_ACQUIRE,A_RESTRICT_SLOT0ONLY,A_MEMSIZE_4B,A_LOAD),"Load Acquire Word", 136406c74f2STaylor Simpson{ fEA_REG(RsV); fLOAD(1,4,u,EA,RdV); }) 137406c74f2STaylor SimpsonQ6INSN(L4_loadd_aq,"Rdd32=memd_aq(Rs32)",ATTRIBS(A_REGWRSIZE_8B,A_ACQUIRE,A_RESTRICT_SLOT0ONLY,A_MEMSIZE_8B,A_LOAD),"Load Acquire Double integer", 138406c74f2STaylor Simpson{ fEA_REG(RsV); fLOAD(1,8,u,EA,RddV); }) 139406c74f2STaylor Simpson 140406c74f2STaylor SimpsonQ6INSN(R6_release_at_vi,"release(Rs32):at",ATTRIBS(A_MEMSIZE_0B,A_RELEASE,A_STORE,A_VTCM_ALLBANK_ACCESS,A_RLS_INNER,A_RLS_ALL_THREAD,A_RESTRICT_NOPACKET,A_RESTRICT_SLOT0ONLY), "Release lock", {fEA_REG(RsV); fSTORE(1,0,EA,RsV); }) 141406c74f2STaylor SimpsonQ6INSN(R6_release_st_vi,"release(Rs32):st",ATTRIBS(A_MEMSIZE_0B,A_RELEASE,A_STORE,A_VTCM_ALLBANK_ACCESS,A_RLS_INNER,A_RLS_SAME_THREAD,A_RESTRICT_NOPACKET,A_RESTRICT_SLOT0ONLY), "Release lock", {fEA_REG(RsV); fSTORE(1,0,EA,RsV); }) 142406c74f2STaylor Simpson 143406c74f2STaylor SimpsonQ6INSN(S2_storew_rl_at_vi,"memw_rl(Rs32):at=Rt32",ATTRIBS(A_REGWRSIZE_4B,A_RELEASE,A_VTCM_ALLBANK_ACCESS,A_RLS_INNER,A_RLS_ALL_THREAD,A_RESTRICT_NOPACKET,A_MEMSIZE_4B,A_STORE,A_RESTRICT_SLOT0ONLY),"Store Release Word", { fEA_REG(RsV); fSTORE(1,4,EA,RtV); }) 144406c74f2STaylor SimpsonQ6INSN(S4_stored_rl_at_vi,"memd_rl(Rs32):at=Rtt32",ATTRIBS(A_REGWRSIZE_8B,A_RELEASE,A_VTCM_ALLBANK_ACCESS,A_RLS_INNER,A_RLS_ALL_THREAD,A_RESTRICT_NOPACKET,A_MEMSIZE_8B,A_STORE,A_RESTRICT_SLOT0ONLY),"Store Release Double integer", { fEA_REG(RsV); fSTORE(1,8,EA,RttV); }) 145406c74f2STaylor Simpson 146406c74f2STaylor SimpsonQ6INSN(S2_storew_rl_st_vi,"memw_rl(Rs32):st=Rt32",ATTRIBS(A_REGWRSIZE_4B,A_RELEASE,A_VTCM_ALLBANK_ACCESS,A_RLS_INNER,A_RLS_SAME_THREAD,A_RESTRICT_NOPACKET,A_MEMSIZE_4B,A_STORE,A_RESTRICT_SLOT0ONLY),"Store Release Word", { fEA_REG(RsV); fSTORE(1,4,EA,RtV); }) 147406c74f2STaylor SimpsonQ6INSN(S4_stored_rl_st_vi,"memd_rl(Rs32):st=Rtt32",ATTRIBS(A_REGWRSIZE_8B,A_RELEASE,A_VTCM_ALLBANK_ACCESS,A_RLS_INNER,A_RLS_SAME_THREAD,A_RESTRICT_NOPACKET,A_MEMSIZE_8B,A_STORE,A_RESTRICT_SLOT0ONLY),"Store Release Double integer", { fEA_REG(RsV); fSTORE(1,8,EA,RttV); }) 148406c74f2STaylor Simpson 149b772528aSTaylor SimpsonQ6INSN(L2_deallocframe,"Rdd32=deallocframe(Rs32):raw", ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_LOAD,A_DEALLOCFRAME), "Deallocate stack frame", 1507cf9345cSTaylor Simpson{ fHIDE(size8u_t tmp;) fEA_REG(RsV); 1517cf9345cSTaylor Simpson fLOAD(1,8,u,EA,tmp); 1527cf9345cSTaylor Simpson RddV = fFRAME_UNSCRAMBLE(tmp); 1537cf9345cSTaylor Simpson fWRITE_SP(EA+8); }) 1547cf9345cSTaylor Simpson 155b772528aSTaylor SimpsonQ6INSN(L4_return,"Rdd32=dealloc_return(Rs32):raw", ATTRIBS(A_REGWRSIZE_8B,A_ROPS_2,A_JINDIR,A_MEMSIZE_8B,A_LOAD,A_RETURN), "Deallocate stack frame and return", 1567cf9345cSTaylor Simpson{ fHIDE(size8u_t tmp;) fEA_REG(RsV); 1577cf9345cSTaylor Simpson fLOAD(1,8,u,EA,tmp); 1587cf9345cSTaylor Simpson RddV = fFRAME_UNSCRAMBLE(tmp); 1597cf9345cSTaylor Simpson fWRITE_SP(EA+8); 1607cf9345cSTaylor Simpson fJUMPR(REG_LR,fGETWORD(1,RddV),COF_TYPE_JUMPR);}) 1617cf9345cSTaylor Simpson 1627cf9345cSTaylor Simpson#define CONDSEM(SRCREG,STALLBITS0,STALLBITS1,PREDFUNC,PREDARG,STALLSPEC,PREDCOND) \ 1637cf9345cSTaylor Simpson{ \ 1647cf9345cSTaylor Simpson fHIDE(size8u_t tmp;) \ 1657cf9345cSTaylor Simpson fBRANCH_SPECULATE_STALL(PREDFUNC##PREDCOND(PREDARG),,STALLSPEC,STALLBITS0,STALLBITS1); \ 1667cf9345cSTaylor Simpson fEA_REG(SRCREG); \ 1677cf9345cSTaylor Simpson if (PREDFUNC##PREDCOND(PREDARG)) { \ 1687cf9345cSTaylor Simpson fLOAD(1,8,u,EA,tmp); \ 1697cf9345cSTaylor Simpson RddV = fFRAME_UNSCRAMBLE(tmp); \ 1707cf9345cSTaylor Simpson fWRITE_SP(EA+8); \ 1717cf9345cSTaylor Simpson fJUMPR(REG_LR,fGETWORD(1,RddV),COF_TYPE_JUMPR); \ 1727cf9345cSTaylor Simpson } else { \ 1737cf9345cSTaylor Simpson LOAD_CANCEL(EA); \ 1747cf9345cSTaylor Simpson } \ 1757cf9345cSTaylor Simpson} 1767cf9345cSTaylor Simpson 1777cf9345cSTaylor Simpson#define COND_RETURN_TF(TG,TG2,DOTNEW,STALLBITS0,STALLBITS1,STALLSPEC,ATTRIBS,PREDFUNC,PREDARG,T_NT) \ 1787cf9345cSTaylor Simpson Q6INSN(TG##_t##TG2,"if (Pv4"DOTNEW") Rdd32=dealloc_return(Rs32)"T_NT":raw",ATTRIBS,"deallocate stack frame and return", \ 1797cf9345cSTaylor Simpson CONDSEM(RsV,STALLBITS0,STALLBITS1,PREDFUNC,PREDARG,STALLSPEC,)) \ 1807cf9345cSTaylor Simpson Q6INSN(TG##_f##TG2,"if (!Pv4"DOTNEW") Rdd32=dealloc_return(Rs32)"T_NT":raw",ATTRIBS,"deallocate stack frame and return", \ 1817cf9345cSTaylor Simpson CONDSEM(RsV,STALLBITS0,STALLBITS1,PREDFUNC##NOT,PREDARG,STALLSPEC,)) 1827cf9345cSTaylor Simpson 1837cf9345cSTaylor Simpson#define COND_RETURN_NEW(TG,STALLBITS0,STALLBITS1,ATTRIBS) \ 1847cf9345cSTaylor Simpson COND_RETURN_TF(TG,new_pt,".new",12,0,SPECULATE_TAKEN,ATTRIBS,fLSBNEW,PvN,":t") \ 1857cf9345cSTaylor Simpson COND_RETURN_TF(TG,new_pnt,".new",12,0,SPECULATE_NOT_TAKEN,ATTRIBS,fLSBNEW,PvN,":nt") \ 1867cf9345cSTaylor Simpson 187b772528aSTaylor Simpson#define RETURN_ATTRIBS A_ROPS_2,A_MEMSIZE_8B,A_LOAD,A_RETURN 1887cf9345cSTaylor Simpson 1897cf9345cSTaylor SimpsonCOND_RETURN_TF(L4_return,,,7,0,SPECULATE_NOT_TAKEN,ATTRIBS(RETURN_ATTRIBS,A_JINDIROLD),fLSBOLD,PvV,) 1907cf9345cSTaylor SimpsonCOND_RETURN_NEW(L4_return,12,0,ATTRIBS(RETURN_ATTRIBS,A_JINDIRNEW)) 1917cf9345cSTaylor Simpson 1927cf9345cSTaylor Simpson 1937cf9345cSTaylor Simpson 1947cf9345cSTaylor Simpson 195b772528aSTaylor SimpsonQ6INSN(L2_loadw_locked,"Rd32=memw_locked(Rs32)", ATTRIBS(A_REGWRSIZE_4B,A_MEMSIZE_4B,A_LOAD,A_RESTRICT_SLOT0ONLY,A_RESTRICT_PACKET_AXOK,A_NOTE_AXOK), "Load word with lock", 1967cf9345cSTaylor Simpson{ fEA_REG(RsV); fLOAD_LOCKED(1,4,u,EA,RdV) }) 1977cf9345cSTaylor Simpson 1987cf9345cSTaylor Simpson 199b772528aSTaylor SimpsonQ6INSN(S2_storew_locked,"memw_locked(Rs32,Pd4)=Rt32", ATTRIBS(A_REGWRSIZE_4B,A_MEMSIZE_4B,A_STORE,A_RESTRICT_SLOT0ONLY,A_RESTRICT_PACKET_AXOK,A_NOTE_AXOK,A_RESTRICT_LATEPRED,A_NOTE_LATEPRED), "Store word with lock", 2007cf9345cSTaylor Simpson{ fEA_REG(RsV); fSTORE_LOCKED(1,4,EA,RtV,PdV) }) 2017cf9345cSTaylor Simpson 2027cf9345cSTaylor Simpson 203b772528aSTaylor SimpsonQ6INSN(L4_loadd_locked,"Rdd32=memd_locked(Rs32)", ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_LOAD,A_RESTRICT_SLOT0ONLY,A_RESTRICT_PACKET_AXOK,A_NOTE_AXOK), "Load double with lock", 2047cf9345cSTaylor Simpson{ fEA_REG(RsV); fLOAD_LOCKED(1,8,u,EA,RddV) }) 2057cf9345cSTaylor Simpson 206b772528aSTaylor SimpsonQ6INSN(S4_stored_locked,"memd_locked(Rs32,Pd4)=Rtt32", ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_STORE,A_RESTRICT_SLOT0ONLY,A_RESTRICT_PACKET_AXOK,A_NOTE_AXOK,A_RESTRICT_LATEPRED,A_NOTE_LATEPRED), "Store word with lock", 2077cf9345cSTaylor Simpson{ fEA_REG(RsV); fSTORE_LOCKED(1,8,EA,RttV,PdV) }) 2087cf9345cSTaylor Simpson 2097cf9345cSTaylor Simpson 2107cf9345cSTaylor Simpson 2117cf9345cSTaylor Simpson 2127cf9345cSTaylor Simpson 2137cf9345cSTaylor Simpson/*****************************************************************/ 2147cf9345cSTaylor Simpson/* */ 2157cf9345cSTaylor Simpson/* Predicated LDST */ 2167cf9345cSTaylor Simpson/* */ 2177cf9345cSTaylor Simpson/*****************************************************************/ 2187cf9345cSTaylor Simpson 2197cf9345cSTaylor Simpson#define STD_PLD_AMODES(TAG,OPER,DESCR,ATTRIB,SHFT,SHFTNUM,SEMANTICS)\ 2207cf9345cSTaylor SimpsonQ6INSN(L4_##TAG##_rr, OPER"(Rs32+Rt32<<#u2)", ATTRIB,DESCR,{fEA_RRs(RsV,RtV,uiV); SEMANTICS;})\ 2217cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##t_io, "if (Pt4) "OPER"(Rs32+#u6:"SHFT")", ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if(fLSBOLD(PtV)){SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2227cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##t_pi, "if (Pt4) "OPER"(Rx32++#s4:"SHFT")", ATTRIB,DESCR,{fEA_REG(RxV); if(fLSBOLD(PtV)){ fPM_I(RxV,siV); SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2237cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##f_io, "if (!Pt4) "OPER"(Rs32+#u6:"SHFT")", ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if(fLSBOLDNOT(PtV)){ SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2247cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##f_pi, "if (!Pt4) "OPER"(Rx32++#s4:"SHFT")", ATTRIB,DESCR,{fEA_REG(RxV); if(fLSBOLDNOT(PtV)){ fPM_I(RxV,siV); SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2257cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##tnew_io,"if (Pt4.new) "OPER"(Rs32+#u6:"SHFT")",ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if (fLSBNEW(PtN)) { SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2267cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##fnew_io,"if (!Pt4.new) "OPER"(Rs32+#u6:"SHFT")",ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if (fLSBNEWNOT(PtN)) { SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2277cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##t_rr, "if (Pv4) "OPER"(Rs32+Rt32<<#u2)", ATTRIB,DESCR,{fEA_RRs(RsV,RtV,uiV); if(fLSBOLD(PvV)){ SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2287cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##f_rr, "if (!Pv4) "OPER"(Rs32+Rt32<<#u2)", ATTRIB,DESCR,{fEA_RRs(RsV,RtV,uiV); if(fLSBOLDNOT(PvV)){ SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2297cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##tnew_rr,"if (Pv4.new) "OPER"(Rs32+Rt32<<#u2)",ATTRIB,DESCR,{fEA_RRs(RsV,RtV,uiV); if (fLSBNEW(PvN)) { SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2307cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##fnew_rr,"if (!Pv4.new) "OPER"(Rs32+Rt32<<#u2)",ATTRIB,DESCR,{fEA_RRs(RsV,RtV,uiV); if (fLSBNEWNOT(PvN)) { SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2317cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##tnew_pi, "if (Pt4.new) "OPER"(Rx32++#s4:"SHFT")", ATTRIB,DESCR,{fEA_REG(RxV); if(fLSBNEW(PtN)){ fPM_I(RxV,siV); SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2327cf9345cSTaylor SimpsonQ6INSN(L2_p##TAG##fnew_pi, "if (!Pt4.new) "OPER"(Rx32++#s4:"SHFT")", ATTRIB,DESCR,{fEA_REG(RxV); if(fLSBNEWNOT(PtN)){ fPM_I(RxV,siV); SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2337cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##t_abs, "if (Pt4) "OPER"(#u6)", ATTRIB,DESCR,{fMUST_IMMEXT(uiV); fEA_IMM(uiV); if(fLSBOLD(PtV)){ SEMANTICS;} else {LOAD_CANCEL(EA);}})\ 2347cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##f_abs, "if (!Pt4) "OPER"(#u6)", ATTRIB,DESCR,{fMUST_IMMEXT(uiV); fEA_IMM(uiV); if(fLSBOLDNOT(PtV)){ SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2357cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##tnew_abs,"if (Pt4.new) "OPER"(#u6)",ATTRIB,DESCR,{fMUST_IMMEXT(uiV); fEA_IMM(uiV);if (fLSBNEW(PtN)) { SEMANTICS; } else {LOAD_CANCEL(EA);}})\ 2367cf9345cSTaylor SimpsonQ6INSN(L4_p##TAG##fnew_abs,"if (!Pt4.new) "OPER"(#u6)",ATTRIB,DESCR,{fMUST_IMMEXT(uiV); fEA_IMM(uiV);if (fLSBNEWNOT(PtN)) { SEMANTICS; } else {LOAD_CANCEL(EA);}}) 2377cf9345cSTaylor Simpson 2387cf9345cSTaylor Simpson 2397cf9345cSTaylor Simpson 2407cf9345cSTaylor Simpson/* The set of 32-bit predicated load instructions */ 241b772528aSTaylor SimpsonSTD_PLD_AMODES(loadrub,"Rd32=memub","Load Unsigned Byte",ATTRIBS(A_ARCHV2,A_MEMSIZE_1B,A_LOAD,A_REGWRSIZE_1B),"0",0,fLOAD(1,1,u,EA,RdV)) 242b772528aSTaylor SimpsonSTD_PLD_AMODES(loadrb, "Rd32=memb", "Load signed Byte",ATTRIBS(A_ARCHV2,A_MEMSIZE_1B,A_LOAD),"0",0,fLOAD(1,1,s,EA,RdV)) 243b772528aSTaylor SimpsonSTD_PLD_AMODES(loadruh,"Rd32=memuh","Load unsigned Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_MEMSIZE_2B,A_LOAD),"1",1,fLOAD(1,2,u,EA,RdV)) 244b772528aSTaylor SimpsonSTD_PLD_AMODES(loadrh, "Rd32=memh", "Load signed Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_MEMSIZE_2B,A_LOAD),"1",1,fLOAD(1,2,s,EA,RdV)) 245b772528aSTaylor SimpsonSTD_PLD_AMODES(loadri, "Rd32=memw", "Load Word",ATTRIBS(A_REGWRSIZE_4B,A_ARCHV2,A_MEMSIZE_4B,A_LOAD),"2",2,fLOAD(1,4,u,EA,RdV)) 246b772528aSTaylor SimpsonSTD_PLD_AMODES(loadrd, "Rdd32=memd","Load Double integer",ATTRIBS(A_REGWRSIZE_8B,A_ARCHV2,A_MEMSIZE_8B,A_LOAD),"3",3,fLOAD(1,8,u,EA,RddV)) 2477cf9345cSTaylor Simpson 2487cf9345cSTaylor Simpson/* The set of addressing modes standard to all predicated store instructions */ 2497cf9345cSTaylor Simpson#define STD_PST_AMODES(TAG,DEST,OPER,DESCR,ATTRIB,SHFT,SHFTNUM,SEMANTICS)\ 2507cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##_rr, OPER"(Rs32+Ru32<<#u2)="DEST, ATTRIB,DESCR,{fEA_RRs(RsV,RuV,uiV); SEMANTICS;})\ 2517cf9345cSTaylor SimpsonQ6INSN(S2_p##TAG##t_io, "if (Pv4) "OPER"(Rs32+#u6:"SHFT")="DEST, ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if (fLSBOLD(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2527cf9345cSTaylor SimpsonQ6INSN(S2_p##TAG##t_pi, "if (Pv4) "OPER"(Rx32++#s4:"SHFT")="DEST, ATTRIB,DESCR,{fEA_REG(RxV); if (fLSBOLD(PvV)){ fPM_I(RxV,siV); SEMANTICS;} else {STORE_CANCEL(EA);}})\ 2537cf9345cSTaylor SimpsonQ6INSN(S2_p##TAG##f_io, "if (!Pv4) "OPER"(Rs32+#u6:"SHFT")="DEST, ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if (fLSBOLDNOT(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2547cf9345cSTaylor SimpsonQ6INSN(S2_p##TAG##f_pi, "if (!Pv4) "OPER"(Rx32++#s4:"SHFT")="DEST, ATTRIB,DESCR,{fEA_REG(RxV); if (fLSBOLDNOT(PvV)){ fPM_I(RxV,siV); SEMANTICS;} else {STORE_CANCEL(EA);}})\ 2557cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##t_rr, "if (Pv4) "OPER"(Rs32+Ru32<<#u2)="DEST, ATTRIB,DESCR,{fEA_RRs(RsV,RuV,uiV); if (fLSBOLD(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2567cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##f_rr, "if (!Pv4) "OPER"(Rs32+Ru32<<#u2)="DEST, ATTRIB,DESCR,{fEA_RRs(RsV,RuV,uiV); if (fLSBOLDNOT(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2577cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##tnew_io,"if (Pv4.new) "OPER"(Rs32+#u6:"SHFT")="DEST,ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if ( fLSBNEW(PvN)) { SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2587cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##fnew_io,"if (!Pv4.new) "OPER"(Rs32+#u6:"SHFT")="DEST,ATTRIB,DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); if (fLSBNEWNOT(PvN)) { SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2597cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##tnew_rr,"if (Pv4.new) "OPER"(Rs32+Ru32<<#u2)="DEST,ATTRIB,DESCR,{fEA_RRs(RsV,RuV,uiV); if ( fLSBNEW(PvN)) { SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2607cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##fnew_rr,"if (!Pv4.new) "OPER"(Rs32+Ru32<<#u2)="DEST,ATTRIB,DESCR,{fEA_RRs(RsV,RuV,uiV); if (fLSBNEWNOT(PvN)) { SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2617cf9345cSTaylor SimpsonQ6INSN(S2_p##TAG##tnew_pi, "if (Pv4.new) "OPER"(Rx32++#s4:"SHFT")="DEST, ATTRIB,DESCR,{fEA_REG(RxV); if (fLSBNEW(PvN)){ fPM_I(RxV,siV); SEMANTICS;} else {STORE_CANCEL(EA);}})\ 2627cf9345cSTaylor SimpsonQ6INSN(S2_p##TAG##fnew_pi, "if (!Pv4.new) "OPER"(Rx32++#s4:"SHFT")="DEST, ATTRIB,DESCR,{fEA_REG(RxV); if (fLSBNEWNOT(PvN)){ fPM_I(RxV,siV); SEMANTICS;} else {STORE_CANCEL(EA);}})\ 2637cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##t_abs, "if (Pv4) "OPER"(#u6)="DEST, ATTRIB,DESCR,{fMUST_IMMEXT(uiV); fEA_IMM(uiV); if (fLSBOLD(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2647cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##f_abs, "if (!Pv4) "OPER"(#u6)="DEST, ATTRIB,DESCR,{fMUST_IMMEXT(uiV);fEA_IMM(uiV); if (fLSBOLDNOT(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2657cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##tnew_abs,"if (Pv4.new) "OPER"(#u6)="DEST,ATTRIB,DESCR,{fMUST_IMMEXT(uiV);fEA_IMM(uiV); if ( fLSBNEW(PvN)) { SEMANTICS; } else {STORE_CANCEL(EA);}})\ 2667cf9345cSTaylor SimpsonQ6INSN(S4_p##TAG##fnew_abs,"if (!Pv4.new) "OPER"(#u6)="DEST,ATTRIB,DESCR,{fMUST_IMMEXT(uiV);fEA_IMM(uiV); if (fLSBNEWNOT(PvN)) { SEMANTICS; } else {STORE_CANCEL(EA);}}) 2677cf9345cSTaylor Simpson 2687cf9345cSTaylor Simpson 2697cf9345cSTaylor Simpson 2707cf9345cSTaylor Simpson 2717cf9345cSTaylor Simpson/* The set of 32-bit predicated store instructions */ 272b772528aSTaylor SimpsonSTD_PST_AMODES(storerb,"Rt32","memb","Store Byte",ATTRIBS(A_ARCHV2,A_MEMSIZE_1B,A_STORE),"0",0,fSTORE(1,1,EA,fGETBYTE(0,RtV))) 273b772528aSTaylor SimpsonSTD_PST_AMODES(storerh,"Rt32","memh","Store Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_MEMSIZE_2B,A_STORE),"1",1,fSTORE(1,2,EA,fGETHALF(0,RtV))) 274b772528aSTaylor SimpsonSTD_PST_AMODES(storerf,"Rt.H32","memh","Store Upper Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_MEMSIZE_2B,A_STORE),"1",1,fSTORE(1,2,EA,fGETHALF(1,RtV))) 275b772528aSTaylor SimpsonSTD_PST_AMODES(storeri,"Rt32","memw","Store Word",ATTRIBS(A_REGWRSIZE_4B,A_ARCHV2,A_MEMSIZE_4B,A_STORE),"2",2,fSTORE(1,4,EA,RtV)) 276b772528aSTaylor SimpsonSTD_PST_AMODES(storerd,"Rtt32","memd","Store Double integer",ATTRIBS(A_REGWRSIZE_8B,A_ARCHV2,A_MEMSIZE_8B,A_STORE),"3",3,fSTORE(1,8,EA,RttV)) 277b772528aSTaylor SimpsonSTD_PST_AMODES(storerinew,"Nt8.new","memw","Store Word",ATTRIBS(A_REGWRSIZE_4B,A_ARCHV2,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_4B,A_STORE,A_RESTRICT_NOSLOT1_STORE),"2",2,fSTORE(1,4,EA,fNEWREG_ST(NtN))) 278b772528aSTaylor SimpsonSTD_PST_AMODES(storerbnew,"Nt8.new","memb","Store Byte",ATTRIBS(A_ARCHV2,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_1B,A_STORE,A_RESTRICT_NOSLOT1_STORE),"0",0,fSTORE(1,1,EA,fGETBYTE(0,fNEWREG_ST(NtN)))) 279b772528aSTaylor SimpsonSTD_PST_AMODES(storerhnew,"Nt8.new","memh","Store Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_2B,A_STORE,A_RESTRICT_NOSLOT1_STORE),"1",1,fSTORE(1,2,EA,fGETHALF(0,fNEWREG_ST(NtN)))) 2807cf9345cSTaylor Simpson 2817cf9345cSTaylor Simpson 2827cf9345cSTaylor Simpson 2837cf9345cSTaylor Simpson 2847cf9345cSTaylor Simpson/*****************************************************************/ 2857cf9345cSTaylor Simpson/* */ 2867cf9345cSTaylor Simpson/* Mem-Ops (Load-op-Store) */ 2877cf9345cSTaylor Simpson/* */ 2887cf9345cSTaylor Simpson/*****************************************************************/ 2897cf9345cSTaylor Simpson 2907cf9345cSTaylor Simpson/* The set of 32-bit non-predicated mem-ops */ 2917cf9345cSTaylor Simpson#define STD_MEMOP_AMODES(TAG,OPER,DESCR,SEMANTICS)\ 292b772528aSTaylor SimpsonQ6INSN(L4_##TAG##w_io, "memw(Rs32+#u6:2)"OPER, ATTRIBS(A_MEMOP,A_ROPS_3,A_MEMSIZE_4B,A_RESTRICT_SLOT0ONLY,A_RESTRICT_NOSLOT1_STORE),DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); fHIDE(size4s_t tmp;) fLOAD(1,4,s,EA,tmp); SEMANTICS; fSTORE(1,4,EA,tmp); })\ 293b772528aSTaylor SimpsonQ6INSN(L4_##TAG##b_io, "memb(Rs32+#u6:0)"OPER, ATTRIBS(A_MEMOP,A_ROPS_3,A_MEMSIZE_1B,A_RESTRICT_SLOT0ONLY,A_RESTRICT_NOSLOT1_STORE),DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); fHIDE(size4s_t tmp;) fLOAD(1,1,s,EA,tmp); SEMANTICS; fSTORE(1,1,EA,tmp); })\ 294b772528aSTaylor SimpsonQ6INSN(L4_##TAG##h_io, "memh(Rs32+#u6:1)"OPER, ATTRIBS(A_MEMOP,A_ROPS_3,A_MEMSIZE_2B,A_RESTRICT_SLOT0ONLY,A_RESTRICT_NOSLOT1_STORE),DESCR,{fIMMEXT(uiV); fEA_RI(RsV,uiV); fHIDE(size4s_t tmp;) fLOAD(1,2,s,EA,tmp); SEMANTICS; fSTORE(1,2,EA,tmp); }) 2957cf9345cSTaylor Simpson 2967cf9345cSTaylor Simpson 2977cf9345cSTaylor Simpson 2987cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(add_memop, "+=Rt32", "Add Register to Memory Word", tmp += RtV) 2997cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(sub_memop, "-=Rt32", "Sub Register from Memory Word", tmp -= RtV) 3007cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(and_memop, "&=Rt32", "Logical AND Register to Memory Word", tmp &= RtV) 3017cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(or_memop, "|=Rt32", "Logical OR Register to Memory Word", tmp |= RtV) 3027cf9345cSTaylor Simpson 3037cf9345cSTaylor Simpson 3047cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(iadd_memop, "+=#U5", "Add Immediate to Memory Word", tmp += UiV) 3057cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(isub_memop, "-=#U5", "Sub Immediate to Memory Word", tmp -= UiV) 3067cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(iand_memop, "=clrbit(#U5)", "Clear a bit in memory", tmp &= (~(1<<UiV))) 3077cf9345cSTaylor SimpsonSTD_MEMOP_AMODES(ior_memop, "=setbit(#U5)", "Set a bit in memory", tmp |= (1<<UiV)) 3087cf9345cSTaylor Simpson 3097cf9345cSTaylor Simpson 3107cf9345cSTaylor Simpson/*****************************************************************/ 3117cf9345cSTaylor Simpson/* */ 3127cf9345cSTaylor Simpson/* V4 store immediates */ 3137cf9345cSTaylor Simpson/* */ 3147cf9345cSTaylor Simpson/*****************************************************************/ 3157cf9345cSTaylor Simpson/* Predicated Store immediates */ 3167cf9345cSTaylor Simpson#define V4_PSTI_AMODES(TAG,DEST,OPER,DESCR,ATTRIB,SHFT,SEMANTICS)\ 3177cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##t_io,"if (Pv4) "OPER"(Rs32+#u6:"SHFT")="DEST,ATTRIB,DESCR,{fEA_RI(RsV,uiV); if (fLSBOLD(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 3187cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##f_io,"if (!Pv4) "OPER"(Rs32+#u6:"SHFT")="DEST,ATTRIB,DESCR,{fEA_RI(RsV,uiV); if (fLSBOLDNOT(PvV)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 3197cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##tnew_io,"if (Pv4.new) "OPER"(Rs32+#u6:"SHFT")="DEST,ATTRIB,DESCR,{fEA_RI(RsV,uiV); if (fLSBNEW(PvN)){ SEMANTICS; } else {STORE_CANCEL(EA);}})\ 3207cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##fnew_io,"if (!Pv4.new) "OPER"(Rs32+#u6:"SHFT")="DEST,ATTRIB,DESCR,{fEA_RI(RsV,uiV); if (fLSBNEWNOT(PvN)){ SEMANTICS; } else {STORE_CANCEL(EA);}}) 3217cf9345cSTaylor Simpson 3227cf9345cSTaylor Simpson/* The set of 32-bit store immediate instructions */ 323b772528aSTaylor SimpsonV4_PSTI_AMODES(storeirb,"#S6","memb","Store Immediate Byte",ATTRIBS(A_ARCHV2,A_ROPS_2,A_MEMSIZE_1B,A_STORE,A_STOREIMMED),"0",fIMMEXT(SiV); fSTORE(1,1,EA,SiV)) 324b772528aSTaylor SimpsonV4_PSTI_AMODES(storeirh,"#S6","memh","Store Immediate Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_ROPS_2,A_MEMSIZE_2B,A_STORE,A_STOREIMMED),"1",fIMMEXT(SiV); fSTORE(1,2,EA,SiV)) 325b772528aSTaylor SimpsonV4_PSTI_AMODES(storeiri,"#S6","memw","Store Immediate Word",ATTRIBS(A_REGWRSIZE_4B,A_ARCHV2,A_ROPS_2,A_MEMSIZE_4B,A_STORE,A_STOREIMMED),"2",fIMMEXT(SiV); fSTORE(1,4,EA,SiV)) 3267cf9345cSTaylor Simpson 3277cf9345cSTaylor Simpson 3287cf9345cSTaylor Simpson/* Non-predicated store immediates */ 3297cf9345cSTaylor Simpson#define V4_STI_AMODES(TAG,DEST,OPER,DESCR,ATTRIB,SHFT,SEMANTICS)\ 3307cf9345cSTaylor SimpsonQ6INSN(S4_##TAG##_io, OPER"(Rs32+#u6:"SHFT")="DEST, ATTRIB,DESCR,{fEA_RI(RsV,uiV); SEMANTICS; }) 3317cf9345cSTaylor Simpson 3327cf9345cSTaylor Simpson/* The set of 32-bit store immediate instructions */ 333b772528aSTaylor SimpsonV4_STI_AMODES(storeirb,"#S8","memb","Store Immediate Byte",ATTRIBS(A_ARCHV2,A_ROPS_2,A_MEMSIZE_1B,A_STORE,A_STOREIMMED),"0",fIMMEXT(SiV); fSTORE(1,1,EA,SiV)) 334b772528aSTaylor SimpsonV4_STI_AMODES(storeirh,"#S8","memh","Store Immediate Half integer",ATTRIBS(A_REGWRSIZE_2B,A_ARCHV2,A_ROPS_2,A_MEMSIZE_2B,A_STORE,A_STOREIMMED),"1",fIMMEXT(SiV); fSTORE(1,2,EA,SiV)) 335b772528aSTaylor SimpsonV4_STI_AMODES(storeiri,"#S8","memw","Store Immediate Word",ATTRIBS(A_REGWRSIZE_4B,A_ARCHV2,A_ROPS_2,A_MEMSIZE_4B,A_STORE,A_STOREIMMED),"2",fIMMEXT(SiV); fSTORE(1,4,EA,SiV)) 3367cf9345cSTaylor Simpson 3377cf9345cSTaylor Simpson 3387cf9345cSTaylor Simpson 3397cf9345cSTaylor Simpson 3407cf9345cSTaylor Simpson 3417cf9345cSTaylor Simpson 3427cf9345cSTaylor Simpson 3437cf9345cSTaylor Simpson/*****************************************************************/ 3447cf9345cSTaylor Simpson/* */ 3457cf9345cSTaylor Simpson/* V2 GP-relative LD/ST */ 3467cf9345cSTaylor Simpson/* */ 3477cf9345cSTaylor Simpson/*****************************************************************/ 3487cf9345cSTaylor Simpson 3497cf9345cSTaylor Simpson#define STD_GPLD_AMODES(TAG,OPER,DESCR,ATTRIB,SHFT,SEMANTICS)\ 3507cf9345cSTaylor SimpsonQ6INSN(L2_##TAG##gp, OPER"(gp+#u16:"SHFT")", ATTRIB,DESCR,{fIMMEXT(uiV); fEA_GPI(uiV); SEMANTICS; }) 3517cf9345cSTaylor Simpson 3527cf9345cSTaylor Simpson/* The set of 32-bit load instructions */ 353b772528aSTaylor SimpsonSTD_GPLD_AMODES(loadrub,"Rd32=memub","Load Unsigned Byte",ATTRIBS(A_MEMSIZE_1B,A_LOAD,A_ARCHV2,A_REGWRSIZE_1B),"0",fLOAD(1,1,u,EA,RdV)) 354b772528aSTaylor SimpsonSTD_GPLD_AMODES(loadrb, "Rd32=memb", "Load signed Byte",ATTRIBS(A_MEMSIZE_1B,A_LOAD,A_ARCHV2),"0",fLOAD(1,1,s,EA,RdV)) 355b772528aSTaylor SimpsonSTD_GPLD_AMODES(loadruh,"Rd32=memuh","Load unsigned Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_LOAD,A_ARCHV2),"1",fLOAD(1,2,u,EA,RdV)) 356b772528aSTaylor SimpsonSTD_GPLD_AMODES(loadrh, "Rd32=memh", "Load signed Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_LOAD,A_ARCHV2),"1",fLOAD(1,2,s,EA,RdV)) 357b772528aSTaylor SimpsonSTD_GPLD_AMODES(loadri, "Rd32=memw", "Load Word",ATTRIBS(A_REGWRSIZE_4B,A_MEMSIZE_4B,A_LOAD,A_ARCHV2),"2",fLOAD(1,4,u,EA,RdV)) 358b772528aSTaylor SimpsonSTD_GPLD_AMODES(loadrd, "Rdd32=memd","Load Double integer",ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_LOAD,A_ARCHV2),"3",fLOAD(1,8,u,EA,RddV)) 3597cf9345cSTaylor Simpson 3607cf9345cSTaylor Simpson 3617cf9345cSTaylor Simpson#define STD_GPST_AMODES(TAG,DEST,OPER,DESCR,ATTRIB,SHFT,SEMANTICS)\ 3627cf9345cSTaylor SimpsonQ6INSN(S2_##TAG##gp, OPER"(gp+#u16:"SHFT")="DEST, ATTRIB,DESCR,{fIMMEXT(uiV); fEA_GPI(uiV); SEMANTICS; }) 3637cf9345cSTaylor Simpson 3647cf9345cSTaylor Simpson/* The set of 32-bit store instructions */ 365b772528aSTaylor SimpsonSTD_GPST_AMODES(storerb, "Rt32", "memb","Store Byte",ATTRIBS(A_MEMSIZE_1B,A_STORE,A_ARCHV2),"0",fSTORE(1,1,EA,fGETBYTE(0,RtV))) 366b772528aSTaylor SimpsonSTD_GPST_AMODES(storerh, "Rt32", "memh","Store Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_STORE,A_ARCHV2),"1",fSTORE(1,2,EA,fGETHALF(0,RtV))) 367b772528aSTaylor SimpsonSTD_GPST_AMODES(storerf, "Rt.H32", "memh","Store Upper Half integer",ATTRIBS(A_REGWRSIZE_2B,A_MEMSIZE_2B,A_STORE,A_ARCHV2),"1",fSTORE(1,2,EA,fGETHALF(1,RtV))) 368b772528aSTaylor SimpsonSTD_GPST_AMODES(storeri, "Rt32", "memw","Store Word",ATTRIBS(A_REGWRSIZE_4B,A_MEMSIZE_4B,A_STORE,A_ARCHV2),"2",fSTORE(1,4,EA,RtV)) 369b772528aSTaylor SimpsonSTD_GPST_AMODES(storerd, "Rtt32","memd","Store Double integer",ATTRIBS(A_REGWRSIZE_8B,A_MEMSIZE_8B,A_STORE,A_ARCHV2),"3",fSTORE(1,8,EA,RttV)) 370b772528aSTaylor SimpsonSTD_GPST_AMODES(storerinew, "Nt8.new", "memw","Store Word",ATTRIBS(A_REGWRSIZE_4B,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_4B,A_STORE,A_RESTRICT_NOSLOT1_STORE,A_ARCHV2),"2",fSTORE(1,4,EA,fNEWREG_ST(NtN))) 371b772528aSTaylor SimpsonSTD_GPST_AMODES(storerbnew, "Nt8.new", "memb","Store Byte",ATTRIBS(A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_1B,A_STORE,A_RESTRICT_NOSLOT1_STORE,A_ARCHV2),"0",fSTORE(1,1,EA,fGETBYTE(0,fNEWREG_ST(NtN)))) 372b772528aSTaylor SimpsonSTD_GPST_AMODES(storerhnew, "Nt8.new", "memh","Store Half integer",ATTRIBS(A_REGWRSIZE_2B,A_NOTE_NEWVAL_SLOT0,A_NVSTORE,A_NOTE_NVSLOT0,A_MEMSIZE_2B,A_STORE,A_RESTRICT_NOSLOT1_STORE,A_ARCHV2),"1",fSTORE(1,2,EA,fGETHALF(0,fNEWREG_ST(NtN)))) 373