xref: /qemu/target/hexagon/imported/shift.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 * S-type Instructions
207cf9345cSTaylor Simpson */
217cf9345cSTaylor Simpson
227cf9345cSTaylor Simpson/**********************************************/
237cf9345cSTaylor Simpson/* SHIFTS                                     */
247cf9345cSTaylor Simpson/**********************************************/
257cf9345cSTaylor Simpson
267cf9345cSTaylor Simpson/* NOTE: Rdd = Rs *right* shifts don't make sense */
277cf9345cSTaylor Simpson/* NOTE: Rd[d] = Rs[s] *right* shifts with saturation don't make sense */
287cf9345cSTaylor Simpson
297cf9345cSTaylor Simpson
307cf9345cSTaylor Simpson#define RSHIFTTYPES(TAGEND,REGD,REGS,REGSTYPE,ACC,ACCSRC,SAT,SATOPT,ATTRS) \
317cf9345cSTaylor SimpsonQ6INSN(S2_asr_r_##TAGEND,#REGD "32" #ACC "=asr(" #REGS "32,Rt32)" #SATOPT,ATTRIBS(ATTRS), \
327cf9345cSTaylor Simpson    "Arithmetic Shift Right by Register", \
337cf9345cSTaylor Simpson    {  \
347cf9345cSTaylor Simpson        fHIDE(size4s_t) shamt=fSXTN(7,32,RtV);\
357cf9345cSTaylor Simpson        REGD##V = SAT(ACCSRC ACC fBIDIR_ASHIFTR(REGS##V,shamt,REGSTYPE));  \
367cf9345cSTaylor Simpson    })\
377cf9345cSTaylor Simpson\
387cf9345cSTaylor SimpsonQ6INSN(S2_asl_r_##TAGEND,#REGD "32" #ACC "=asl(" #REGS "32,Rt32)" #SATOPT,ATTRIBS(ATTRS), \
397cf9345cSTaylor Simpson    "Arithmetic Shift Left by Register", \
407cf9345cSTaylor Simpson    {  \
417cf9345cSTaylor Simpson        fHIDE(size4s_t) shamt=fSXTN(7,32,RtV);\
427cf9345cSTaylor Simpson        REGD##V = SAT(ACCSRC ACC fBIDIR_ASHIFTL(REGS##V,shamt,REGSTYPE));  \
437cf9345cSTaylor Simpson    })\
447cf9345cSTaylor Simpson\
457cf9345cSTaylor SimpsonQ6INSN(S2_lsr_r_##TAGEND,#REGD "32" #ACC "=lsr(" #REGS "32,Rt32)" #SATOPT,ATTRIBS(ATTRS), \
467cf9345cSTaylor Simpson    "Logical Shift Right by Register", \
477cf9345cSTaylor Simpson    {  \
487cf9345cSTaylor Simpson        fHIDE(size4s_t) shamt=fSXTN(7,32,RtV);\
497cf9345cSTaylor Simpson        REGD##V = SAT(ACCSRC ACC fBIDIR_LSHIFTR(REGS##V,shamt,REGSTYPE));  \
507cf9345cSTaylor Simpson    })\
517cf9345cSTaylor Simpson\
527cf9345cSTaylor SimpsonQ6INSN(S2_lsl_r_##TAGEND,#REGD "32" #ACC "=lsl(" #REGS "32,Rt32)" #SATOPT,ATTRIBS(ATTRS), \
537cf9345cSTaylor Simpson    "Logical Shift Left by Register", \
547cf9345cSTaylor Simpson    {  \
557cf9345cSTaylor Simpson        fHIDE(size4s_t) shamt=fSXTN(7,32,RtV);\
567cf9345cSTaylor Simpson        REGD##V = SAT(ACCSRC ACC fBIDIR_LSHIFTL(REGS##V,shamt,REGSTYPE));  \
577cf9345cSTaylor Simpson    })
587cf9345cSTaylor Simpson
597cf9345cSTaylor SimpsonRSHIFTTYPES(r,Rd,Rs,4_8,,,fECHO,,)
607cf9345cSTaylor SimpsonRSHIFTTYPES(p,Rdd,Rss,8_8,,,fECHO,,)
617cf9345cSTaylor SimpsonRSHIFTTYPES(r_acc,Rx,Rs,4_8,+,RxV,fECHO,,)
627cf9345cSTaylor SimpsonRSHIFTTYPES(p_acc,Rxx,Rss,8_8,+,RxxV,fECHO,,)
637cf9345cSTaylor SimpsonRSHIFTTYPES(r_nac,Rx,Rs,4_8,-,RxV,fECHO,,)
647cf9345cSTaylor SimpsonRSHIFTTYPES(p_nac,Rxx,Rss,8_8,-,RxxV,fECHO,,)
657cf9345cSTaylor Simpson
667cf9345cSTaylor SimpsonRSHIFTTYPES(r_and,Rx,Rs,4_8,&,RxV,fECHO,,)
677cf9345cSTaylor SimpsonRSHIFTTYPES(r_or,Rx,Rs,4_8,|,RxV,fECHO,,)
687cf9345cSTaylor SimpsonRSHIFTTYPES(p_and,Rxx,Rss,8_8,&,RxxV,fECHO,,)
697cf9345cSTaylor SimpsonRSHIFTTYPES(p_or,Rxx,Rss,8_8,|,RxxV,fECHO,,)
707cf9345cSTaylor SimpsonRSHIFTTYPES(p_xor,Rxx,Rss,8_8,^,RxxV,fECHO,,)
717cf9345cSTaylor Simpson
727cf9345cSTaylor Simpson
737cf9345cSTaylor Simpson#undef RSHIFTTYPES
747cf9345cSTaylor Simpson
757cf9345cSTaylor Simpson/* Register shift with saturation */
767cf9345cSTaylor Simpson#define RSATSHIFTTYPES(TAGEND,REGD,REGS,REGSTYPE) \
777cf9345cSTaylor SimpsonQ6INSN(S2_asr_r_##TAGEND,#REGD "32" "=asr(" #REGS "32,Rt32):sat",ATTRIBS(), \
787cf9345cSTaylor Simpson    "Arithmetic Shift Right by Register", \
797cf9345cSTaylor Simpson    {  \
807cf9345cSTaylor Simpson        fHIDE(size4s_t) shamt=fSXTN(7,32,RtV);\
817cf9345cSTaylor Simpson        REGD##V = fBIDIR_ASHIFTR_SAT(REGS##V,shamt,REGSTYPE);  \
827cf9345cSTaylor Simpson    })\
837cf9345cSTaylor Simpson\
847cf9345cSTaylor SimpsonQ6INSN(S2_asl_r_##TAGEND,#REGD "32" "=asl(" #REGS "32,Rt32):sat",ATTRIBS(), \
857cf9345cSTaylor Simpson    "Arithmetic Shift Left by Register", \
867cf9345cSTaylor Simpson    {  \
877cf9345cSTaylor Simpson        fHIDE(size4s_t) shamt=fSXTN(7,32,RtV);\
887cf9345cSTaylor Simpson        REGD##V = fBIDIR_ASHIFTL_SAT(REGS##V,shamt,REGSTYPE);  \
897cf9345cSTaylor Simpson    })
907cf9345cSTaylor Simpson
917cf9345cSTaylor SimpsonRSATSHIFTTYPES(r_sat,Rd,Rs,4_8)
927cf9345cSTaylor Simpson
937cf9345cSTaylor Simpson
947cf9345cSTaylor Simpson
957cf9345cSTaylor Simpson
967cf9345cSTaylor Simpson
977cf9345cSTaylor Simpson#define ISHIFTTYPES(TAGEND,SIZE,REGD,REGS,REGSTYPE,ACC,ACCSRC,SAT,SATOPT,ATTRS) \
987cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_##TAGEND,#REGD "32" #ACC "=asr(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(ATTRS), \
997cf9345cSTaylor Simpson    "Arithmetic Shift Right by Immediate", \
1007cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fASHIFTR(REGS##V,uiV,REGSTYPE)); }) \
1017cf9345cSTaylor Simpson\
1027cf9345cSTaylor SimpsonQ6INSN(S2_lsr_i_##TAGEND,#REGD "32" #ACC "=lsr(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(ATTRS), \
1037cf9345cSTaylor Simpson    "Logical Shift Right by Immediate", \
1047cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fLSHIFTR(REGS##V,uiV,REGSTYPE)); }) \
1057cf9345cSTaylor Simpson\
1067cf9345cSTaylor SimpsonQ6INSN(S2_asl_i_##TAGEND,#REGD "32" #ACC "=asl(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(ATTRS), \
1077cf9345cSTaylor Simpson    "Shift Left by Immediate", \
1087cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fASHIFTL(REGS##V,uiV,REGSTYPE)); }) \
1097cf9345cSTaylor SimpsonQ6INSN(S6_rol_i_##TAGEND,#REGD "32" #ACC "=rol(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(ATTRS), \
1107cf9345cSTaylor Simpson    "Rotate Left by Immediate", \
1117cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fROTL(REGS##V,uiV,REGSTYPE)); })
1127cf9345cSTaylor Simpson
1137cf9345cSTaylor Simpson
1147cf9345cSTaylor Simpson#define ISHIFTTYPES_ONLY_ASL(TAGEND,SIZE,REGD,REGS,REGSTYPE,ACC,ACCSRC,SAT,SATOPT) \
1157cf9345cSTaylor SimpsonQ6INSN(S2_asl_i_##TAGEND,#REGD "32" #ACC "=asl(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(), \
1167cf9345cSTaylor Simpson    "", \
1177cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fASHIFTL(REGS##V,uiV,REGSTYPE)); })
1187cf9345cSTaylor Simpson
1197cf9345cSTaylor Simpson#define ISHIFTTYPES_ONLY_ASR(TAGEND,SIZE,REGD,REGS,REGSTYPE,ACC,ACCSRC,SAT,SATOPT) \
1207cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_##TAGEND,#REGD "32" #ACC "=asr(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(), \
1217cf9345cSTaylor Simpson    "", \
1227cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fASHIFTR(REGS##V,uiV,REGSTYPE)); })
1237cf9345cSTaylor Simpson
1247cf9345cSTaylor Simpson
1257cf9345cSTaylor Simpson#define ISHIFTTYPES_NOASR(TAGEND,SIZE,REGD,REGS,REGSTYPE,ACC,ACCSRC,SAT,SATOPT) \
1267cf9345cSTaylor SimpsonQ6INSN(S2_lsr_i_##TAGEND,#REGD "32" #ACC "=lsr(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(), \
1277cf9345cSTaylor Simpson    "Logical Shift Right by Register", \
1287cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fLSHIFTR(REGS##V,uiV,REGSTYPE)); }) \
1297cf9345cSTaylor SimpsonQ6INSN(S2_asl_i_##TAGEND,#REGD "32" #ACC "=asl(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(), \
1307cf9345cSTaylor Simpson    "Shift Left by Register", \
1317cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fASHIFTL(REGS##V,uiV,REGSTYPE)); }) \
1327cf9345cSTaylor SimpsonQ6INSN(S6_rol_i_##TAGEND,#REGD "32" #ACC "=rol(" #REGS "32,#u" #SIZE ")" #SATOPT,ATTRIBS(), \
1337cf9345cSTaylor Simpson    "Rotate Left by Immediate", \
1347cf9345cSTaylor Simpson    { REGD##V = SAT(ACCSRC ACC fROTL(REGS##V,uiV,REGSTYPE)); })
1357cf9345cSTaylor Simpson
1367cf9345cSTaylor Simpson
1377cf9345cSTaylor Simpson
1387cf9345cSTaylor SimpsonISHIFTTYPES(r,5,Rd,Rs,4_4,,,fECHO,,)
1397cf9345cSTaylor SimpsonISHIFTTYPES(p,6,Rdd,Rss,8_8,,,fECHO,,)
1407cf9345cSTaylor SimpsonISHIFTTYPES(r_acc,5,Rx,Rs,4_4,+,RxV,fECHO,,)
1417cf9345cSTaylor SimpsonISHIFTTYPES(p_acc,6,Rxx,Rss,8_8,+,RxxV,fECHO,,)
1427cf9345cSTaylor SimpsonISHIFTTYPES(r_nac,5,Rx,Rs,4_4,-,RxV,fECHO,,)
1437cf9345cSTaylor SimpsonISHIFTTYPES(p_nac,6,Rxx,Rss,8_8,-,RxxV,fECHO,,)
1447cf9345cSTaylor Simpson
1457cf9345cSTaylor SimpsonISHIFTTYPES_NOASR(r_xacc,5,Rx,Rs,4_4,^, RxV,fECHO,)
1467cf9345cSTaylor SimpsonISHIFTTYPES_NOASR(p_xacc,6,Rxx,Rss,8_8,^, RxxV,fECHO,)
1477cf9345cSTaylor Simpson
1487cf9345cSTaylor SimpsonISHIFTTYPES(r_and,5,Rx,Rs,4_4,&,RxV,fECHO,,)
1497cf9345cSTaylor SimpsonISHIFTTYPES(r_or,5,Rx,Rs,4_4,|,RxV,fECHO,,)
1507cf9345cSTaylor SimpsonISHIFTTYPES(p_and,6,Rxx,Rss,8_8,&,RxxV,fECHO,,)
1517cf9345cSTaylor SimpsonISHIFTTYPES(p_or,6,Rxx,Rss,8_8,|,RxxV,fECHO,,)
1527cf9345cSTaylor Simpson
1537cf9345cSTaylor SimpsonISHIFTTYPES_ONLY_ASL(r_sat,5,Rd,Rs,4_8,,,fSAT,:sat)
1547cf9345cSTaylor Simpson
1557cf9345cSTaylor Simpson
1567cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_r_rnd,"Rd32=asr(Rs32,#u5):rnd",ATTRIBS(),
1577cf9345cSTaylor Simpson       "Shift right with round",
1587cf9345cSTaylor Simpson       { RdV = fASHIFTR(((fASHIFTR(RsV,uiV,4_8))+1),1,8_8); })
1597cf9345cSTaylor Simpson
1607cf9345cSTaylor Simpson
1617cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_p_rnd,"Rdd32=asr(Rss32,#u6):rnd",ATTRIBS(), "Shift right with round",
1627cf9345cSTaylor Simpson{ fHIDE(size8u_t tmp;)
1637cf9345cSTaylor Simpson  fHIDE(size8u_t rnd;)
1647cf9345cSTaylor Simpson  tmp = fASHIFTR(RssV,uiV,8_8);
1657cf9345cSTaylor Simpson  rnd = tmp & 1;
1667cf9345cSTaylor Simpson  RddV = fASHIFTR(tmp,1,8_8) + rnd; })
1677cf9345cSTaylor Simpson
1687cf9345cSTaylor Simpson
1697cf9345cSTaylor SimpsonQ6INSN(S4_lsli,"Rd32=lsl(#s6,Rt32)",ATTRIBS(), "Shift an immediate left by register amount",
1707cf9345cSTaylor Simpson{
1717cf9345cSTaylor Simpson    fHIDE(size4s_t) shamt = fSXTN(7,32,RtV);
1727cf9345cSTaylor Simpson    RdV = fBIDIR_LSHIFTL(siV,shamt,4_8);
1737cf9345cSTaylor Simpson})
1747cf9345cSTaylor Simpson
1757cf9345cSTaylor Simpson
1767cf9345cSTaylor Simpson
1777cf9345cSTaylor Simpson
1787cf9345cSTaylor SimpsonQ6INSN(S2_addasl_rrri,"Rd32=addasl(Rt32,Rs32,#u3)",ATTRIBS(),
1797cf9345cSTaylor Simpson    "Shift left by small amount and add",
1807cf9345cSTaylor Simpson    { RdV = RtV + fASHIFTL(RsV,uiV,4_4); })
1817cf9345cSTaylor Simpson
1827cf9345cSTaylor Simpson
1837cf9345cSTaylor Simpson
1847cf9345cSTaylor Simpson#define SHIFTOPI(TAGEND,INNEROP,INNERSEM)\
1857cf9345cSTaylor SimpsonQ6INSN(S4_andi_##TAGEND,"Rx32=and(#u8,"INNEROP")",,"Shift-op",{RxV=fIMMEXT(uiV)&INNERSEM;})\
1867cf9345cSTaylor SimpsonQ6INSN(S4_ori_##TAGEND, "Rx32=or(#u8,"INNEROP")",,"Shift-op",{RxV=fIMMEXT(uiV)|INNERSEM;})\
1877cf9345cSTaylor SimpsonQ6INSN(S4_addi_##TAGEND,"Rx32=add(#u8,"INNEROP")",,"Shift-op",{RxV=fIMMEXT(uiV)+INNERSEM;})\
1887cf9345cSTaylor SimpsonQ6INSN(S4_subi_##TAGEND,"Rx32=sub(#u8,"INNEROP")",,"Shift-op",{RxV=fIMMEXT(uiV)-INNERSEM;})
1897cf9345cSTaylor Simpson
1907cf9345cSTaylor Simpson
1917cf9345cSTaylor SimpsonSHIFTOPI(asl_ri,"asl(Rx32,#U5)",(RxV<<UiV))
1927cf9345cSTaylor SimpsonSHIFTOPI(lsr_ri,"lsr(Rx32,#U5)",(((unsigned int)RxV)>>UiV))
1937cf9345cSTaylor Simpson
1947cf9345cSTaylor Simpson
1957cf9345cSTaylor Simpson/**********************************************/
1967cf9345cSTaylor Simpson/* PERMUTES                                   */
1977cf9345cSTaylor Simpson/**********************************************/
1987cf9345cSTaylor SimpsonQ6INSN(S2_valignib,"Rdd32=valignb(Rtt32,Rss32,#u3)",
1997cf9345cSTaylor SimpsonATTRIBS(), "Vector align bytes",
2007cf9345cSTaylor Simpson{
2017cf9345cSTaylor Simpson  RddV = (fLSHIFTR(RssV,uiV*8,8_8))|(fASHIFTL(RttV,((8-uiV)*8),8_8));
2027cf9345cSTaylor Simpson})
2037cf9345cSTaylor Simpson
2047cf9345cSTaylor SimpsonQ6INSN(S2_valignrb,"Rdd32=valignb(Rtt32,Rss32,Pu4)",
2057cf9345cSTaylor SimpsonATTRIBS(), "Align with register",
2067cf9345cSTaylor Simpson{ RddV = fLSHIFTR(RssV,(PuV&0x7)*8,8_8)|(fASHIFTL(RttV,(8-(PuV&0x7))*8,8_8));})
2077cf9345cSTaylor Simpson
2087cf9345cSTaylor SimpsonQ6INSN(S2_vspliceib,"Rdd32=vspliceb(Rss32,Rtt32,#u3)",
2097cf9345cSTaylor SimpsonATTRIBS(), "Vector splice bytes",
2107cf9345cSTaylor Simpson{ RddV = fASHIFTL(RttV,uiV*8,8_8) | fZXTN(uiV*8,64,RssV); })
2117cf9345cSTaylor Simpson
2127cf9345cSTaylor SimpsonQ6INSN(S2_vsplicerb,"Rdd32=vspliceb(Rss32,Rtt32,Pu4)",
2137cf9345cSTaylor SimpsonATTRIBS(), "Splice with register",
2147cf9345cSTaylor Simpson{ RddV = fASHIFTL(RttV,(PuV&7)*8,8_8) | fZXTN((PuV&7)*8,64,RssV); })
2157cf9345cSTaylor Simpson
2167cf9345cSTaylor SimpsonQ6INSN(S2_vsplatrh,"Rdd32=vsplath(Rs32)",
2177cf9345cSTaylor SimpsonATTRIBS(), "Vector splat halfwords from register",
2187cf9345cSTaylor Simpson{
2197cf9345cSTaylor Simpson    fHIDE(int i;)
2207cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
2217cf9345cSTaylor Simpson        fSETHALF(i,RddV, fGETHALF(0,RsV));
2227cf9345cSTaylor Simpson    }
2237cf9345cSTaylor Simpson})
2247cf9345cSTaylor Simpson
2257cf9345cSTaylor Simpson
2267cf9345cSTaylor SimpsonQ6INSN(S2_vsplatrb,"Rd32=vsplatb(Rs32)",
2277cf9345cSTaylor SimpsonATTRIBS(), "Vector splat bytes from register",
2287cf9345cSTaylor Simpson{
2297cf9345cSTaylor Simpson    fHIDE(int i;)
2307cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
2317cf9345cSTaylor Simpson        fSETBYTE(i,RdV, fGETBYTE(0,RsV));
2327cf9345cSTaylor Simpson    }
2337cf9345cSTaylor Simpson})
2347cf9345cSTaylor Simpson
2357cf9345cSTaylor SimpsonQ6INSN(S6_vsplatrbp,"Rdd32=vsplatb(Rs32)",
2367cf9345cSTaylor SimpsonATTRIBS(), "Vector splat bytes from register",
2377cf9345cSTaylor Simpson{
2387cf9345cSTaylor Simpson    fHIDE(int i;)
2397cf9345cSTaylor Simpson    for (i=0;i<8;i++) {
2407cf9345cSTaylor Simpson        fSETBYTE(i,RddV, fGETBYTE(0,RsV));
2417cf9345cSTaylor Simpson    }
2427cf9345cSTaylor Simpson})
2437cf9345cSTaylor Simpson
2447cf9345cSTaylor Simpson
2457cf9345cSTaylor Simpson
2467cf9345cSTaylor Simpson/**********************************************/
2477cf9345cSTaylor Simpson/* Insert/Extract[u]                          */
2487cf9345cSTaylor Simpson/**********************************************/
2497cf9345cSTaylor Simpson
2507cf9345cSTaylor SimpsonQ6INSN(S2_insert,"Rx32=insert(Rs32,#u5,#U5)",
2517cf9345cSTaylor SimpsonATTRIBS(), "Insert bits",
2527cf9345cSTaylor Simpson{
2537cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
2547cf9345cSTaylor Simpson    fHIDE(int) offset=UiV;
2557cf9345cSTaylor Simpson    /* clear bits in Rxx where new bits go */
2567cf9345cSTaylor Simpson    RxV &= ~(((fCONSTLL(1)<<width)-1)<<offset);
2577cf9345cSTaylor Simpson    /* OR in new bits */
2587cf9345cSTaylor Simpson    RxV |= ((RsV & ((fCONSTLL(1)<<width)-1)) << offset);
2597cf9345cSTaylor Simpson})
2607cf9345cSTaylor Simpson
2617cf9345cSTaylor Simpson
2627cf9345cSTaylor SimpsonQ6INSN(S2_tableidxb,"Rx32=tableidxb(Rs32,#u4,#S6):raw",
2637cf9345cSTaylor SimpsonATTRIBS(A_ARCHV2), "Extract and insert bits",
2647cf9345cSTaylor Simpson{
2657cf9345cSTaylor Simpson        fHIDE(int) width=uiV;
2667cf9345cSTaylor Simpson        fHIDE(int) offset=SiV;
2677cf9345cSTaylor Simpson        fHIDE(int) field = fEXTRACTU_BIDIR(RsV,width,offset);
2687cf9345cSTaylor Simpson        fINSERT_BITS(RxV,width,0,field);
2697cf9345cSTaylor Simpson})
2707cf9345cSTaylor Simpson
2717cf9345cSTaylor SimpsonQ6INSN(S2_tableidxh,"Rx32=tableidxh(Rs32,#u4,#S6):raw",
2727cf9345cSTaylor SimpsonATTRIBS(A_ARCHV2), "Extract and insert bits",
2737cf9345cSTaylor Simpson{
2747cf9345cSTaylor Simpson        fHIDE(int) width=uiV;
2757cf9345cSTaylor Simpson        fHIDE(int) offset=SiV+1;
2767cf9345cSTaylor Simpson        fHIDE(int) field = fEXTRACTU_BIDIR(RsV,width,offset);
2777cf9345cSTaylor Simpson        fINSERT_BITS(RxV,width,1,field);
2787cf9345cSTaylor Simpson})
2797cf9345cSTaylor Simpson
2807cf9345cSTaylor SimpsonQ6INSN(S2_tableidxw,"Rx32=tableidxw(Rs32,#u4,#S6):raw",
2817cf9345cSTaylor SimpsonATTRIBS(A_ARCHV2), "Extract and insert bits",
2827cf9345cSTaylor Simpson{
2837cf9345cSTaylor Simpson        fHIDE(int) width=uiV;
2847cf9345cSTaylor Simpson        fHIDE(int) offset=SiV+2;
2857cf9345cSTaylor Simpson        fHIDE(int) field = fEXTRACTU_BIDIR(RsV,width,offset);
2867cf9345cSTaylor Simpson        fINSERT_BITS(RxV,width,2,field);
2877cf9345cSTaylor Simpson})
2887cf9345cSTaylor Simpson
2897cf9345cSTaylor SimpsonQ6INSN(S2_tableidxd,"Rx32=tableidxd(Rs32,#u4,#S6):raw",
2907cf9345cSTaylor SimpsonATTRIBS(A_ARCHV2), "Extract and insert bits",
2917cf9345cSTaylor Simpson{
2927cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
2937cf9345cSTaylor Simpson    fHIDE(int) offset=SiV+3;
2947cf9345cSTaylor Simpson    fHIDE(int) field = fEXTRACTU_BIDIR(RsV,width,offset);
2957cf9345cSTaylor Simpson    fINSERT_BITS(RxV,width,3,field);
2967cf9345cSTaylor Simpson})
2977cf9345cSTaylor Simpson
2987cf9345cSTaylor Simpson
2997cf9345cSTaylor SimpsonQ6INSN(A4_bitspliti,"Rdd32=bitsplit(Rs32,#u5)",
3007cf9345cSTaylor SimpsonATTRIBS(), "Split a bitfield into two registers",
3017cf9345cSTaylor Simpson{
3027cf9345cSTaylor Simpson    fSETWORD(1,RddV,(fCAST4_4u(RsV)>>uiV));
3037cf9345cSTaylor Simpson    fSETWORD(0,RddV,fZXTN(uiV,32,RsV));
3047cf9345cSTaylor Simpson})
3057cf9345cSTaylor Simpson
3067cf9345cSTaylor SimpsonQ6INSN(A4_bitsplit,"Rdd32=bitsplit(Rs32,Rt32)",
3077cf9345cSTaylor SimpsonATTRIBS(), "Split a bitfield into two registers",
3087cf9345cSTaylor Simpson{
3097cf9345cSTaylor Simpson    fHIDE(size4u_t) shamt = fZXTN(5,32,RtV);
3107cf9345cSTaylor Simpson    fSETWORD(1,RddV,(fCAST4_4u(RsV)>>shamt));
3117cf9345cSTaylor Simpson    fSETWORD(0,RddV,fZXTN(shamt,32,RsV));
3127cf9345cSTaylor Simpson})
3137cf9345cSTaylor Simpson
3147cf9345cSTaylor Simpson
3157cf9345cSTaylor Simpson
3167cf9345cSTaylor Simpson
3177cf9345cSTaylor SimpsonQ6INSN(S4_extract,"Rd32=extract(Rs32,#u5,#U5)",
3187cf9345cSTaylor SimpsonATTRIBS(), "Extract signed bitfield",
3197cf9345cSTaylor Simpson{
3207cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
3217cf9345cSTaylor Simpson    fHIDE(int) offset=UiV;
3227cf9345cSTaylor Simpson    RdV = fSXTN(width,32,(fCAST4_4u(RsV) >> offset));
3237cf9345cSTaylor Simpson})
3247cf9345cSTaylor Simpson
3257cf9345cSTaylor Simpson
3267cf9345cSTaylor SimpsonQ6INSN(S2_extractu,"Rd32=extractu(Rs32,#u5,#U5)",
3277cf9345cSTaylor SimpsonATTRIBS(), "Extract unsigned bitfield",
3287cf9345cSTaylor Simpson{
3297cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
3307cf9345cSTaylor Simpson    fHIDE(int) offset=UiV;
3317cf9345cSTaylor Simpson    RdV = fZXTN(width,32,(fCAST4_4u(RsV) >> offset));
3327cf9345cSTaylor Simpson})
3337cf9345cSTaylor Simpson
3347cf9345cSTaylor SimpsonQ6INSN(S2_insertp,"Rxx32=insert(Rss32,#u6,#U6)",
3357cf9345cSTaylor SimpsonATTRIBS(), "Insert bits",
3367cf9345cSTaylor Simpson{
3377cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
3387cf9345cSTaylor Simpson    fHIDE(int) offset=UiV;
3397cf9345cSTaylor Simpson    /* clear bits in Rxx where new bits go */
3407cf9345cSTaylor Simpson    RxxV &= ~(((fCONSTLL(1)<<width)-1)<<offset);
3417cf9345cSTaylor Simpson    /* OR in new bits */
3427cf9345cSTaylor Simpson    RxxV |= ((RssV & ((fCONSTLL(1)<<width)-1)) << offset);
3437cf9345cSTaylor Simpson})
3447cf9345cSTaylor Simpson
3457cf9345cSTaylor Simpson
3467cf9345cSTaylor SimpsonQ6INSN(S4_extractp,"Rdd32=extract(Rss32,#u6,#U6)",
3477cf9345cSTaylor SimpsonATTRIBS(), "Extract signed bitfield",
3487cf9345cSTaylor Simpson{
3497cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
3507cf9345cSTaylor Simpson    fHIDE(int) offset=UiV;
3517cf9345cSTaylor Simpson    RddV = fSXTN(width,64,(fCAST8_8u(RssV) >> offset));
3527cf9345cSTaylor Simpson})
3537cf9345cSTaylor Simpson
3547cf9345cSTaylor Simpson
3557cf9345cSTaylor SimpsonQ6INSN(S2_extractup,"Rdd32=extractu(Rss32,#u6,#U6)",
3567cf9345cSTaylor SimpsonATTRIBS(), "Extract unsigned bitfield",
3577cf9345cSTaylor Simpson{
3587cf9345cSTaylor Simpson    fHIDE(int) width=uiV;
3597cf9345cSTaylor Simpson    fHIDE(int) offset=UiV;
3607cf9345cSTaylor Simpson    RddV = fZXTN(width,64,(fCAST8_8u(RssV) >> offset));
3617cf9345cSTaylor Simpson})
3627cf9345cSTaylor Simpson
3637cf9345cSTaylor Simpson
3647cf9345cSTaylor Simpson
3657cf9345cSTaylor Simpson
3667cf9345cSTaylor SimpsonQ6INSN(S2_mask,"Rd32=mask(#u5,#U5)",
3677cf9345cSTaylor SimpsonATTRIBS(), "Form mask from immediate",
3687cf9345cSTaylor Simpson{
3697cf9345cSTaylor Simpson    RdV = ((1<<uiV)-1) << UiV;
3707cf9345cSTaylor Simpson})
3717cf9345cSTaylor Simpson
3727cf9345cSTaylor Simpson
3737cf9345cSTaylor Simpson
3747cf9345cSTaylor Simpson
3757cf9345cSTaylor Simpson
3767cf9345cSTaylor SimpsonQ6INSN(S2_insert_rp,"Rx32=insert(Rs32,Rtt32)",
3777cf9345cSTaylor SimpsonATTRIBS(), "Insert bits",
3787cf9345cSTaylor Simpson{
3797cf9345cSTaylor Simpson    fHIDE(int) width=fZXTN(6,32,(fGETWORD(1,RttV)));
3807cf9345cSTaylor Simpson    fHIDE(int) offset=fSXTN(7,32,(fGETWORD(0,RttV)));
3817cf9345cSTaylor Simpson    fHIDE(size8u_t) mask = ((fCONSTLL(1)<<width)-1);
3827cf9345cSTaylor Simpson    if (offset < 0) {
3837cf9345cSTaylor Simpson        RxV = 0;
3847cf9345cSTaylor Simpson    } else {
3857cf9345cSTaylor Simpson        /* clear bits in Rxx where new bits go */
3867cf9345cSTaylor Simpson        RxV &= ~(mask<<offset);
3877cf9345cSTaylor Simpson        /* OR in new bits */
3887cf9345cSTaylor Simpson        RxV |= ((RsV & mask) << offset);
3897cf9345cSTaylor Simpson    }
3907cf9345cSTaylor Simpson})
3917cf9345cSTaylor Simpson
3927cf9345cSTaylor Simpson
3937cf9345cSTaylor SimpsonQ6INSN(S4_extract_rp,"Rd32=extract(Rs32,Rtt32)",
3947cf9345cSTaylor SimpsonATTRIBS(), "Extract signed bitfield",
3957cf9345cSTaylor Simpson{
3967cf9345cSTaylor Simpson    fHIDE(int) width=fZXTN(6,32,(fGETWORD(1,RttV)));
3977cf9345cSTaylor Simpson    fHIDE(int) offset=fSXTN(7,32,(fGETWORD(0,RttV)));
3987cf9345cSTaylor Simpson    RdV = fSXTN(width,64,fBIDIR_LSHIFTR(fCAST4_8u(RsV),offset,4_8));
3997cf9345cSTaylor Simpson})
4007cf9345cSTaylor Simpson
4017cf9345cSTaylor Simpson
4027cf9345cSTaylor Simpson
4037cf9345cSTaylor SimpsonQ6INSN(S2_extractu_rp,"Rd32=extractu(Rs32,Rtt32)",
4047cf9345cSTaylor SimpsonATTRIBS(), "Extract unsigned bitfield",
4057cf9345cSTaylor Simpson{
4067cf9345cSTaylor Simpson    fHIDE(int) width=fZXTN(6,32,(fGETWORD(1,RttV)));
4077cf9345cSTaylor Simpson    fHIDE(int) offset=fSXTN(7,32,(fGETWORD(0,RttV)));
4087cf9345cSTaylor Simpson    RdV = fZXTN(width,64,fBIDIR_LSHIFTR(fCAST4_8u(RsV),offset,4_8));
4097cf9345cSTaylor Simpson})
4107cf9345cSTaylor Simpson
4117cf9345cSTaylor SimpsonQ6INSN(S2_insertp_rp,"Rxx32=insert(Rss32,Rtt32)",
4127cf9345cSTaylor SimpsonATTRIBS(), "Insert bits",
4137cf9345cSTaylor Simpson{
4147cf9345cSTaylor Simpson    fHIDE(int) width=fZXTN(6,32,(fGETWORD(1,RttV)));
4157cf9345cSTaylor Simpson    fHIDE(int) offset=fSXTN(7,32,(fGETWORD(0,RttV)));
4167cf9345cSTaylor Simpson    fHIDE(size8u_t) mask = ((fCONSTLL(1)<<width)-1);
4177cf9345cSTaylor Simpson    if (offset < 0) {
4187cf9345cSTaylor Simpson        RxxV = 0;
4197cf9345cSTaylor Simpson    } else {
4207cf9345cSTaylor Simpson        /* clear bits in Rxx where new bits go */
4217cf9345cSTaylor Simpson        RxxV &= ~(mask<<offset);
4227cf9345cSTaylor Simpson        /* OR in new bits */
4237cf9345cSTaylor Simpson        RxxV |= ((RssV & mask) << offset);
4247cf9345cSTaylor Simpson    }
4257cf9345cSTaylor Simpson})
4267cf9345cSTaylor Simpson
4277cf9345cSTaylor Simpson
4287cf9345cSTaylor SimpsonQ6INSN(S4_extractp_rp,"Rdd32=extract(Rss32,Rtt32)",
4297cf9345cSTaylor SimpsonATTRIBS(), "Extract signed bitfield",
4307cf9345cSTaylor Simpson{
4317cf9345cSTaylor Simpson    fHIDE(int) width=fZXTN(6,32,(fGETWORD(1,RttV)));
4327cf9345cSTaylor Simpson    fHIDE(int) offset=fSXTN(7,32,(fGETWORD(0,RttV)));
4337cf9345cSTaylor Simpson    RddV = fSXTN(width,64,fBIDIR_LSHIFTR(fCAST8_8u(RssV),offset,8_8));
4347cf9345cSTaylor Simpson})
4357cf9345cSTaylor Simpson
4367cf9345cSTaylor Simpson
4377cf9345cSTaylor SimpsonQ6INSN(S2_extractup_rp,"Rdd32=extractu(Rss32,Rtt32)",
4387cf9345cSTaylor SimpsonATTRIBS(), "Extract unsigned bitfield",
4397cf9345cSTaylor Simpson{
4407cf9345cSTaylor Simpson    fHIDE(int) width=fZXTN(6,32,(fGETWORD(1,RttV)));
4417cf9345cSTaylor Simpson    fHIDE(int) offset=fSXTN(7,32,(fGETWORD(0,RttV)));
4427cf9345cSTaylor Simpson    RddV = fZXTN(width,64,fBIDIR_LSHIFTR(fCAST8_8u(RssV),offset,8_8));
4437cf9345cSTaylor Simpson})
4447cf9345cSTaylor Simpson
4457cf9345cSTaylor Simpson/**********************************************/
4467cf9345cSTaylor Simpson/* tstbit/setbit/clrbit                       */
4477cf9345cSTaylor Simpson/**********************************************/
4487cf9345cSTaylor Simpson
4497cf9345cSTaylor SimpsonQ6INSN(S2_tstbit_i,"Pd4=tstbit(Rs32,#u5)",
4507cf9345cSTaylor SimpsonATTRIBS(), "Test a bit",
4517cf9345cSTaylor Simpson{
4527cf9345cSTaylor Simpson    PdV = f8BITSOF((RsV & (1<<uiV)) != 0);
4537cf9345cSTaylor Simpson})
4547cf9345cSTaylor Simpson
4557cf9345cSTaylor SimpsonQ6INSN(S4_ntstbit_i,"Pd4=!tstbit(Rs32,#u5)",
4567cf9345cSTaylor SimpsonATTRIBS(), "Test a bit",
4577cf9345cSTaylor Simpson{
4587cf9345cSTaylor Simpson    PdV = f8BITSOF((RsV & (1<<uiV)) == 0);
4597cf9345cSTaylor Simpson})
4607cf9345cSTaylor Simpson
4617cf9345cSTaylor SimpsonQ6INSN(S2_setbit_i,"Rd32=setbit(Rs32,#u5)",
4627cf9345cSTaylor SimpsonATTRIBS(), "Set a bit",
4637cf9345cSTaylor Simpson{
4647cf9345cSTaylor Simpson    RdV = (RsV | (1<<uiV));
4657cf9345cSTaylor Simpson})
4667cf9345cSTaylor Simpson
4677cf9345cSTaylor SimpsonQ6INSN(S2_togglebit_i,"Rd32=togglebit(Rs32,#u5)",
4687cf9345cSTaylor SimpsonATTRIBS(), "Toggle a bit",
4697cf9345cSTaylor Simpson{
4707cf9345cSTaylor Simpson    RdV = (RsV ^ (1<<uiV));
4717cf9345cSTaylor Simpson})
4727cf9345cSTaylor Simpson
4737cf9345cSTaylor SimpsonQ6INSN(S2_clrbit_i,"Rd32=clrbit(Rs32,#u5)",
4747cf9345cSTaylor SimpsonATTRIBS(), "Clear a bit",
4757cf9345cSTaylor Simpson{
4767cf9345cSTaylor Simpson    RdV = (RsV & (~(1<<uiV)));
4777cf9345cSTaylor Simpson})
4787cf9345cSTaylor Simpson
4797cf9345cSTaylor Simpson
4807cf9345cSTaylor Simpson
4817cf9345cSTaylor Simpson/* using a register */
4827cf9345cSTaylor SimpsonQ6INSN(S2_tstbit_r,"Pd4=tstbit(Rs32,Rt32)",
4837cf9345cSTaylor SimpsonATTRIBS(), "Test a bit",
4847cf9345cSTaylor Simpson{
4857cf9345cSTaylor Simpson    PdV = f8BITSOF((fCAST4_8u(RsV) & fBIDIR_LSHIFTL(1,fSXTN(7,32,RtV),4_8)) != 0);
4867cf9345cSTaylor Simpson})
4877cf9345cSTaylor Simpson
4887cf9345cSTaylor SimpsonQ6INSN(S4_ntstbit_r,"Pd4=!tstbit(Rs32,Rt32)",
4897cf9345cSTaylor SimpsonATTRIBS(), "Test a bit",
4907cf9345cSTaylor Simpson{
4917cf9345cSTaylor Simpson    PdV = f8BITSOF((fCAST4_8u(RsV) & fBIDIR_LSHIFTL(1,fSXTN(7,32,RtV),4_8)) == 0);
4927cf9345cSTaylor Simpson})
4937cf9345cSTaylor Simpson
4947cf9345cSTaylor SimpsonQ6INSN(S2_setbit_r,"Rd32=setbit(Rs32,Rt32)",
4957cf9345cSTaylor SimpsonATTRIBS(), "Set a bit",
4967cf9345cSTaylor Simpson{
4977cf9345cSTaylor Simpson    RdV = (RsV | fBIDIR_LSHIFTL(1,fSXTN(7,32,RtV),4_8));
4987cf9345cSTaylor Simpson})
4997cf9345cSTaylor Simpson
5007cf9345cSTaylor SimpsonQ6INSN(S2_togglebit_r,"Rd32=togglebit(Rs32,Rt32)",
5017cf9345cSTaylor SimpsonATTRIBS(), "Toggle a bit",
5027cf9345cSTaylor Simpson{
5037cf9345cSTaylor Simpson    RdV = (RsV ^ fBIDIR_LSHIFTL(1,fSXTN(7,32,RtV),4_8));
5047cf9345cSTaylor Simpson})
5057cf9345cSTaylor Simpson
5067cf9345cSTaylor SimpsonQ6INSN(S2_clrbit_r,"Rd32=clrbit(Rs32,Rt32)",
5077cf9345cSTaylor SimpsonATTRIBS(), "Clear a bit",
5087cf9345cSTaylor Simpson{
5097cf9345cSTaylor Simpson    RdV = (RsV & (~(fBIDIR_LSHIFTL(1,fSXTN(7,32,RtV),4_8))));
5107cf9345cSTaylor Simpson})
5117cf9345cSTaylor Simpson
5127cf9345cSTaylor Simpson
5137cf9345cSTaylor Simpson/**********************************************/
5147cf9345cSTaylor Simpson/* vector shifting                            */
5157cf9345cSTaylor Simpson/**********************************************/
5167cf9345cSTaylor Simpson
5177cf9345cSTaylor Simpson/* Half Vector Immediate Shifts */
5187cf9345cSTaylor Simpson
5197cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_vh,"Rdd32=vasrh(Rss32,#u4)",ATTRIBS(),
5207cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Immediate",
5217cf9345cSTaylor Simpson{
5227cf9345cSTaylor Simpson    fHIDE(int i;)
5237cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5247cf9345cSTaylor Simpson        fSETHALF(i,RddV, (fGETHALF(i,RssV)>>uiV));
5257cf9345cSTaylor Simpson    }
5267cf9345cSTaylor Simpson})
5277cf9345cSTaylor Simpson
5287cf9345cSTaylor Simpson
5297cf9345cSTaylor SimpsonQ6INSN(S2_lsr_i_vh,"Rdd32=vlsrh(Rss32,#u4)",ATTRIBS(),
5307cf9345cSTaylor Simpson    "Vector Logical Shift Right by Immediate",
5317cf9345cSTaylor Simpson{
5327cf9345cSTaylor Simpson    fHIDE(int i;)
5337cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5347cf9345cSTaylor Simpson        fSETHALF(i,RddV, (fGETUHALF(i,RssV)>>uiV));
5357cf9345cSTaylor Simpson    }
5367cf9345cSTaylor Simpson})
5377cf9345cSTaylor Simpson
5387cf9345cSTaylor SimpsonQ6INSN(S2_asl_i_vh,"Rdd32=vaslh(Rss32,#u4)",ATTRIBS(),
5397cf9345cSTaylor Simpson    "Vector Arithmetic Shift Left by Immediate",
5407cf9345cSTaylor Simpson{
5417cf9345cSTaylor Simpson    fHIDE(int i;)
5427cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5437cf9345cSTaylor Simpson        fSETHALF(i,RddV, (fGETHALF(i,RssV)<<uiV));
5447cf9345cSTaylor Simpson    }
5457cf9345cSTaylor Simpson})
5467cf9345cSTaylor Simpson
5477cf9345cSTaylor Simpson/* Half Vector Register Shifts */
5487cf9345cSTaylor Simpson
5497cf9345cSTaylor SimpsonQ6INSN(S2_asr_r_vh,"Rdd32=vasrh(Rss32,Rt32)",ATTRIBS(),
5507cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Register",
5517cf9345cSTaylor Simpson{
5527cf9345cSTaylor Simpson    fHIDE(int i;)
5537cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5547cf9345cSTaylor Simpson        fSETHALF(i,RddV, fBIDIR_ASHIFTR(fGETHALF(i,RssV),fSXTN(7,32,RtV),2_8));
5557cf9345cSTaylor Simpson    }
5567cf9345cSTaylor Simpson})
5577cf9345cSTaylor Simpson
5587cf9345cSTaylor SimpsonQ6INSN(S5_asrhub_rnd_sat,"Rd32=vasrhub(Rss32,#u4):raw",,
5597cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Immediate with Round, Saturate, and Pack",
5607cf9345cSTaylor Simpson{
5617cf9345cSTaylor Simpson    fHIDE(int i;)
5627cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5637cf9345cSTaylor Simpson        fSETBYTE(i,RdV, fSATUB( ((fGETHALF(i,RssV) >> uiV )+1)>>1  ));
5647cf9345cSTaylor Simpson    }
5657cf9345cSTaylor Simpson})
5667cf9345cSTaylor Simpson
5677cf9345cSTaylor SimpsonQ6INSN(S5_asrhub_sat,"Rd32=vasrhub(Rss32,#u4):sat",,
5687cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Immediate with Saturate and Pack",
5697cf9345cSTaylor Simpson{
5707cf9345cSTaylor Simpson    fHIDE(int i;)
5717cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5727cf9345cSTaylor Simpson        fSETBYTE(i,RdV, fSATUB( fGETHALF(i,RssV) >> uiV ));
5737cf9345cSTaylor Simpson    }
5747cf9345cSTaylor Simpson})
5757cf9345cSTaylor Simpson
5767cf9345cSTaylor Simpson
5777cf9345cSTaylor Simpson
5787cf9345cSTaylor SimpsonQ6INSN(S5_vasrhrnd,"Rdd32=vasrh(Rss32,#u4):raw",,
5797cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Immediate with Round",
5807cf9345cSTaylor Simpson{
5817cf9345cSTaylor Simpson    fHIDE(int i;)
5827cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5837cf9345cSTaylor Simpson        fSETHALF(i,RddV, ( ((fGETHALF(i,RssV) >> uiV)+1)>>1  ));
5847cf9345cSTaylor Simpson    }
5857cf9345cSTaylor Simpson})
5867cf9345cSTaylor Simpson
5877cf9345cSTaylor Simpson
5887cf9345cSTaylor SimpsonQ6INSN(S2_asl_r_vh,"Rdd32=vaslh(Rss32,Rt32)",ATTRIBS(),
5897cf9345cSTaylor Simpson    "Vector Arithmetic Shift Left by Register",
5907cf9345cSTaylor Simpson{
5917cf9345cSTaylor Simpson    fHIDE(int i;)
5927cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
5937cf9345cSTaylor Simpson        fSETHALF(i,RddV, fBIDIR_ASHIFTL(fGETHALF(i,RssV),fSXTN(7,32,RtV),2_8));
5947cf9345cSTaylor Simpson    }
5957cf9345cSTaylor Simpson})
5967cf9345cSTaylor Simpson
5977cf9345cSTaylor Simpson
5987cf9345cSTaylor Simpson
5997cf9345cSTaylor SimpsonQ6INSN(S2_lsr_r_vh,"Rdd32=vlsrh(Rss32,Rt32)",ATTRIBS(),
6007cf9345cSTaylor Simpson    "Vector Logical Shift Right by Register",
6017cf9345cSTaylor Simpson{
6027cf9345cSTaylor Simpson    fHIDE(int i;)
6037cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
6047cf9345cSTaylor Simpson        fSETHALF(i,RddV, fBIDIR_LSHIFTR(fGETUHALF(i,RssV),fSXTN(7,32,RtV),2_8));
6057cf9345cSTaylor Simpson    }
6067cf9345cSTaylor Simpson})
6077cf9345cSTaylor Simpson
6087cf9345cSTaylor Simpson
6097cf9345cSTaylor SimpsonQ6INSN(S2_lsl_r_vh,"Rdd32=vlslh(Rss32,Rt32)",ATTRIBS(),
6107cf9345cSTaylor Simpson    "Vector Logical Shift Left by Register",
6117cf9345cSTaylor Simpson{
6127cf9345cSTaylor Simpson    fHIDE(int i;)
6137cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
6147cf9345cSTaylor Simpson        fSETHALF(i,RddV, fBIDIR_LSHIFTL(fGETUHALF(i,RssV),fSXTN(7,32,RtV),2_8));
6157cf9345cSTaylor Simpson    }
6167cf9345cSTaylor Simpson})
6177cf9345cSTaylor Simpson
6187cf9345cSTaylor Simpson
6197cf9345cSTaylor Simpson
6207cf9345cSTaylor Simpson
6217cf9345cSTaylor Simpson/* Word Vector Immediate Shifts */
6227cf9345cSTaylor Simpson
6237cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_vw,"Rdd32=vasrw(Rss32,#u5)",ATTRIBS(),
6247cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Immediate",
6257cf9345cSTaylor Simpson{
6267cf9345cSTaylor Simpson    fHIDE(int i;)
6277cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6287cf9345cSTaylor Simpson        fSETWORD(i,RddV,(fGETWORD(i,RssV)>>uiV));
6297cf9345cSTaylor Simpson    }
6307cf9345cSTaylor Simpson})
6317cf9345cSTaylor Simpson
6327cf9345cSTaylor Simpson
6337cf9345cSTaylor Simpson
6347cf9345cSTaylor SimpsonQ6INSN(S2_asr_i_svw_trun,"Rd32=vasrw(Rss32,#u5)",ATTRIBS(A_ARCHV2),
6357cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Immediate with Truncate and Pack",
6367cf9345cSTaylor Simpson{
6377cf9345cSTaylor Simpson    fHIDE(int i;)
6387cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6397cf9345cSTaylor Simpson        fSETHALF(i,RdV,fGETHALF(0,(fGETWORD(i,RssV)>>uiV)));
6407cf9345cSTaylor Simpson    }
6417cf9345cSTaylor Simpson})
6427cf9345cSTaylor Simpson
6437cf9345cSTaylor SimpsonQ6INSN(S2_asr_r_svw_trun,"Rd32=vasrw(Rss32,Rt32)",ATTRIBS(A_ARCHV2),
6447cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right truncate and Pack",
6457cf9345cSTaylor Simpson{
6467cf9345cSTaylor Simpson    fHIDE(int i;)
6477cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6487cf9345cSTaylor Simpson        fSETHALF(i,RdV,fGETHALF(0,fBIDIR_ASHIFTR(fGETWORD(i,RssV),fSXTN(7,32,RtV),4_8)));
6497cf9345cSTaylor Simpson    }
6507cf9345cSTaylor Simpson})
6517cf9345cSTaylor Simpson
6527cf9345cSTaylor Simpson
6537cf9345cSTaylor SimpsonQ6INSN(S2_lsr_i_vw,"Rdd32=vlsrw(Rss32,#u5)",ATTRIBS(),
6547cf9345cSTaylor Simpson    "Vector Logical Shift Right by Immediate",
6557cf9345cSTaylor Simpson{
6567cf9345cSTaylor Simpson    fHIDE(int i;)
6577cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6587cf9345cSTaylor Simpson        fSETWORD(i,RddV,(fGETUWORD(i,RssV)>>uiV));
6597cf9345cSTaylor Simpson    }
6607cf9345cSTaylor Simpson})
6617cf9345cSTaylor Simpson
6627cf9345cSTaylor SimpsonQ6INSN(S2_asl_i_vw,"Rdd32=vaslw(Rss32,#u5)",ATTRIBS(),
6637cf9345cSTaylor Simpson    "Vector Arithmetic Shift Left by Immediate",
6647cf9345cSTaylor Simpson{
6657cf9345cSTaylor Simpson    fHIDE(int i;)
6667cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6677cf9345cSTaylor Simpson        fSETWORD(i,RddV,(fGETWORD(i,RssV)<<uiV));
6687cf9345cSTaylor Simpson    }
6697cf9345cSTaylor Simpson})
6707cf9345cSTaylor Simpson
6717cf9345cSTaylor Simpson/* Word Vector Register Shifts */
6727cf9345cSTaylor Simpson
6737cf9345cSTaylor SimpsonQ6INSN(S2_asr_r_vw,"Rdd32=vasrw(Rss32,Rt32)",ATTRIBS(),
6747cf9345cSTaylor Simpson    "Vector Arithmetic Shift Right by Register",
6757cf9345cSTaylor Simpson{
6767cf9345cSTaylor Simpson    fHIDE(int i;)
6777cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6787cf9345cSTaylor Simpson        fSETWORD(i,RddV, fBIDIR_ASHIFTR(fGETWORD(i,RssV),fSXTN(7,32,RtV),4_8));
6797cf9345cSTaylor Simpson    }
6807cf9345cSTaylor Simpson})
6817cf9345cSTaylor Simpson
6827cf9345cSTaylor Simpson
6837cf9345cSTaylor Simpson
6847cf9345cSTaylor SimpsonQ6INSN(S2_asl_r_vw,"Rdd32=vaslw(Rss32,Rt32)",ATTRIBS(),
6857cf9345cSTaylor Simpson    "Vector Arithmetic Shift Left by Register",
6867cf9345cSTaylor Simpson{
6877cf9345cSTaylor Simpson    fHIDE(int i;)
6887cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6897cf9345cSTaylor Simpson        fSETWORD(i,RddV, fBIDIR_ASHIFTL(fGETWORD(i,RssV),fSXTN(7,32,RtV),4_8));
6907cf9345cSTaylor Simpson    }
6917cf9345cSTaylor Simpson})
6927cf9345cSTaylor Simpson
6937cf9345cSTaylor Simpson
6947cf9345cSTaylor SimpsonQ6INSN(S2_lsr_r_vw,"Rdd32=vlsrw(Rss32,Rt32)",ATTRIBS(),
6957cf9345cSTaylor Simpson    "Vector Logical Shift Right by Register",
6967cf9345cSTaylor Simpson{
6977cf9345cSTaylor Simpson    fHIDE(int i;)
6987cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
6997cf9345cSTaylor Simpson        fSETWORD(i,RddV, fBIDIR_LSHIFTR(fGETUWORD(i,RssV),fSXTN(7,32,RtV),4_8));
7007cf9345cSTaylor Simpson    }
7017cf9345cSTaylor Simpson})
7027cf9345cSTaylor Simpson
7037cf9345cSTaylor Simpson
7047cf9345cSTaylor Simpson
7057cf9345cSTaylor SimpsonQ6INSN(S2_lsl_r_vw,"Rdd32=vlslw(Rss32,Rt32)",ATTRIBS(),
7067cf9345cSTaylor Simpson    "Vector Logical Shift Left by Register",
7077cf9345cSTaylor Simpson{
7087cf9345cSTaylor Simpson    fHIDE(int i;)
7097cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
7107cf9345cSTaylor Simpson        fSETWORD(i,RddV, fBIDIR_LSHIFTL(fGETUWORD(i,RssV),fSXTN(7,32,RtV),4_8));
7117cf9345cSTaylor Simpson    }
7127cf9345cSTaylor Simpson})
7137cf9345cSTaylor Simpson
7147cf9345cSTaylor Simpson
7157cf9345cSTaylor Simpson
7167cf9345cSTaylor Simpson
7177cf9345cSTaylor Simpson
7187cf9345cSTaylor Simpson/**********************************************/
7197cf9345cSTaylor Simpson/* Vector SXT/ZXT/SAT/TRUN/RNDPACK            */
7207cf9345cSTaylor Simpson/**********************************************/
7217cf9345cSTaylor Simpson
7227cf9345cSTaylor Simpson
7237cf9345cSTaylor SimpsonQ6INSN(S2_vrndpackwh,"Rd32=vrndwh(Rss32)",ATTRIBS(),
7247cf9345cSTaylor Simpson"Round and Pack vector of words to Halfwords",
7257cf9345cSTaylor Simpson{
7267cf9345cSTaylor Simpson    fHIDE(int i;)
7277cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
7287cf9345cSTaylor Simpson        fSETHALF(i,RdV,fGETHALF(1,(fGETWORD(i,RssV)+0x08000)));
7297cf9345cSTaylor Simpson    }
7307cf9345cSTaylor Simpson})
7317cf9345cSTaylor Simpson
7327cf9345cSTaylor SimpsonQ6INSN(S2_vrndpackwhs,"Rd32=vrndwh(Rss32):sat",ATTRIBS(),
7337cf9345cSTaylor Simpson"Round and Pack vector of words to Halfwords",
7347cf9345cSTaylor Simpson{
7357cf9345cSTaylor Simpson    fHIDE(int i;)
7367cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
7377cf9345cSTaylor Simpson        fSETHALF(i,RdV,fGETHALF(1,fSAT(fGETWORD(i,RssV)+0x08000)));
7387cf9345cSTaylor Simpson    }
7397cf9345cSTaylor Simpson})
7407cf9345cSTaylor Simpson
7417cf9345cSTaylor SimpsonQ6INSN(S2_vsxtbh,"Rdd32=vsxtbh(Rs32)",ATTRIBS(A_ARCHV2),
7427cf9345cSTaylor Simpson"Vector sign extend byte to half",
7437cf9345cSTaylor Simpson{
7447cf9345cSTaylor Simpson    fHIDE(int i;)
7457cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
7467cf9345cSTaylor Simpson        fSETHALF(i,RddV,fGETBYTE(i,RsV));
7477cf9345cSTaylor Simpson    }
7487cf9345cSTaylor Simpson})
7497cf9345cSTaylor Simpson
7507cf9345cSTaylor SimpsonQ6INSN(S2_vzxtbh,"Rdd32=vzxtbh(Rs32)",ATTRIBS(),
7517cf9345cSTaylor Simpson"Vector zero extend byte to half",
7527cf9345cSTaylor Simpson{
7537cf9345cSTaylor Simpson    fHIDE(int i;)
7547cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
7557cf9345cSTaylor Simpson        fSETHALF(i,RddV,fGETUBYTE(i,RsV));
7567cf9345cSTaylor Simpson    }
7577cf9345cSTaylor Simpson})
7587cf9345cSTaylor Simpson
7597cf9345cSTaylor SimpsonQ6INSN(S2_vsathub,"Rd32=vsathub(Rss32)",ATTRIBS(),
7607cf9345cSTaylor Simpson"Vector saturate half to unsigned byte",
7617cf9345cSTaylor Simpson{
7627cf9345cSTaylor Simpson    fHIDE(int i;)
7637cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
7647cf9345cSTaylor Simpson        fSETBYTE(i,RdV,fSATUN(8,fGETHALF(i,RssV)));
7657cf9345cSTaylor Simpson    }
7667cf9345cSTaylor Simpson})
7677cf9345cSTaylor Simpson
7687cf9345cSTaylor Simpson
7697cf9345cSTaylor Simpson
7707cf9345cSTaylor Simpson
7717cf9345cSTaylor Simpson
7727cf9345cSTaylor SimpsonQ6INSN(S2_svsathub,"Rd32=vsathub(Rs32)",ATTRIBS(A_ARCHV2),
7737cf9345cSTaylor Simpson"Vector saturate half to unsigned byte",
7747cf9345cSTaylor Simpson{
7757cf9345cSTaylor Simpson    fSETBYTE(0,RdV,fSATUN(8,fGETHALF(0,RsV)));
7767cf9345cSTaylor Simpson    fSETBYTE(1,RdV,fSATUN(8,fGETHALF(1,RsV)));
7777cf9345cSTaylor Simpson    fSETBYTE(2,RdV,0);
7787cf9345cSTaylor Simpson    fSETBYTE(3,RdV,0);
7797cf9345cSTaylor Simpson})
7807cf9345cSTaylor Simpson
7817cf9345cSTaylor SimpsonQ6INSN(S2_svsathb,"Rd32=vsathb(Rs32)",ATTRIBS(A_ARCHV2),
7827cf9345cSTaylor Simpson"Vector saturate half to signed byte",
7837cf9345cSTaylor Simpson{
7847cf9345cSTaylor Simpson    fSETBYTE(0,RdV,fSATN(8,fGETHALF(0,RsV)));
7857cf9345cSTaylor Simpson    fSETBYTE(1,RdV,fSATN(8,fGETHALF(1,RsV)));
7867cf9345cSTaylor Simpson    fSETBYTE(2,RdV,0);
7877cf9345cSTaylor Simpson    fSETBYTE(3,RdV,0);
7887cf9345cSTaylor Simpson})
7897cf9345cSTaylor Simpson
7907cf9345cSTaylor Simpson
7917cf9345cSTaylor SimpsonQ6INSN(S2_vsathb,"Rd32=vsathb(Rss32)",ATTRIBS(A_ARCHV2),
7927cf9345cSTaylor Simpson"Vector saturate half to signed byte",
7937cf9345cSTaylor Simpson{
7947cf9345cSTaylor Simpson    fHIDE(int i;)
7957cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
7967cf9345cSTaylor Simpson        fSETBYTE(i,RdV,fSATN(8,fGETHALF(i,RssV)));
7977cf9345cSTaylor Simpson    }
7987cf9345cSTaylor Simpson})
7997cf9345cSTaylor Simpson
8007cf9345cSTaylor SimpsonQ6INSN(S2_vtrunohb,"Rd32=vtrunohb(Rss32)",ATTRIBS(A_ARCHV2),
8017cf9345cSTaylor Simpson"Vector truncate half to byte: take high",
8027cf9345cSTaylor Simpson{
8037cf9345cSTaylor Simpson    fHIDE(int i;)
8047cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
8057cf9345cSTaylor Simpson        fSETBYTE(i,RdV,fGETBYTE(i*2+1,RssV));
8067cf9345cSTaylor Simpson    }
8077cf9345cSTaylor Simpson})
8087cf9345cSTaylor Simpson
8097cf9345cSTaylor SimpsonQ6INSN(S2_vtrunewh,"Rdd32=vtrunewh(Rss32,Rtt32)",ATTRIBS(A_ARCHV2),
8107cf9345cSTaylor Simpson"Vector truncate word to half: take low",
8117cf9345cSTaylor Simpson{
8127cf9345cSTaylor Simpson    fSETHALF(0,RddV,fGETHALF(0,RttV));
8137cf9345cSTaylor Simpson    fSETHALF(1,RddV,fGETHALF(2,RttV));
8147cf9345cSTaylor Simpson    fSETHALF(2,RddV,fGETHALF(0,RssV));
8157cf9345cSTaylor Simpson    fSETHALF(3,RddV,fGETHALF(2,RssV));
8167cf9345cSTaylor Simpson})
8177cf9345cSTaylor Simpson
8187cf9345cSTaylor SimpsonQ6INSN(S2_vtrunowh,"Rdd32=vtrunowh(Rss32,Rtt32)",ATTRIBS(A_ARCHV2),
8197cf9345cSTaylor Simpson"Vector truncate word to half: take high",
8207cf9345cSTaylor Simpson{
8217cf9345cSTaylor Simpson    fSETHALF(0,RddV,fGETHALF(1,RttV));
8227cf9345cSTaylor Simpson    fSETHALF(1,RddV,fGETHALF(3,RttV));
8237cf9345cSTaylor Simpson    fSETHALF(2,RddV,fGETHALF(1,RssV));
8247cf9345cSTaylor Simpson    fSETHALF(3,RddV,fGETHALF(3,RssV));
8257cf9345cSTaylor Simpson})
8267cf9345cSTaylor Simpson
8277cf9345cSTaylor Simpson
8287cf9345cSTaylor SimpsonQ6INSN(S2_vtrunehb,"Rd32=vtrunehb(Rss32)",ATTRIBS(),
8297cf9345cSTaylor Simpson"Vector truncate half to byte: take low",
8307cf9345cSTaylor Simpson{
8317cf9345cSTaylor Simpson    fHIDE(int i;)
8327cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
8337cf9345cSTaylor Simpson        fSETBYTE(i,RdV,fGETBYTE(i*2,RssV));
8347cf9345cSTaylor Simpson    }
8357cf9345cSTaylor Simpson})
8367cf9345cSTaylor Simpson
8377cf9345cSTaylor SimpsonQ6INSN(S6_vtrunehb_ppp,"Rdd32=vtrunehb(Rss32,Rtt32)",ATTRIBS(),
8387cf9345cSTaylor Simpson"Vector truncate half to byte: take low",
8397cf9345cSTaylor Simpson{
8407cf9345cSTaylor Simpson    fHIDE(int i;)
8417cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
8427cf9345cSTaylor Simpson        fSETBYTE(i,RddV,fGETBYTE(i*2,RttV));
8437cf9345cSTaylor Simpson        fSETBYTE(i+4,RddV,fGETBYTE(i*2,RssV));
8447cf9345cSTaylor Simpson    }
8457cf9345cSTaylor Simpson})
8467cf9345cSTaylor Simpson
8477cf9345cSTaylor SimpsonQ6INSN(S6_vtrunohb_ppp,"Rdd32=vtrunohb(Rss32,Rtt32)",ATTRIBS(),
8487cf9345cSTaylor Simpson"Vector truncate half to byte: take high",
8497cf9345cSTaylor Simpson{
8507cf9345cSTaylor Simpson    fHIDE(int i;)
8517cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
8527cf9345cSTaylor Simpson        fSETBYTE(i,RddV,fGETBYTE(i*2+1,RttV));
8537cf9345cSTaylor Simpson        fSETBYTE(i+4,RddV,fGETBYTE(i*2+1,RssV));
8547cf9345cSTaylor Simpson    }
8557cf9345cSTaylor Simpson})
8567cf9345cSTaylor Simpson
8577cf9345cSTaylor SimpsonQ6INSN(S2_vsxthw,"Rdd32=vsxthw(Rs32)",ATTRIBS(),
8587cf9345cSTaylor Simpson"Vector sign extend half to word",
8597cf9345cSTaylor Simpson{
8607cf9345cSTaylor Simpson    fHIDE(int i;)
8617cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
8627cf9345cSTaylor Simpson        fSETWORD(i,RddV,fGETHALF(i,RsV));
8637cf9345cSTaylor Simpson    }
8647cf9345cSTaylor Simpson})
8657cf9345cSTaylor Simpson
8667cf9345cSTaylor SimpsonQ6INSN(S2_vzxthw,"Rdd32=vzxthw(Rs32)",ATTRIBS(),
8677cf9345cSTaylor Simpson"Vector zero extend half to word",
8687cf9345cSTaylor Simpson{
8697cf9345cSTaylor Simpson    fHIDE(int i;)
8707cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
8717cf9345cSTaylor Simpson        fSETWORD(i,RddV,fGETUHALF(i,RsV));
8727cf9345cSTaylor Simpson    }
8737cf9345cSTaylor Simpson})
8747cf9345cSTaylor Simpson
8757cf9345cSTaylor Simpson
8767cf9345cSTaylor SimpsonQ6INSN(S2_vsatwh,"Rd32=vsatwh(Rss32)",ATTRIBS(),
8777cf9345cSTaylor Simpson"Vector saturate word to signed half",
8787cf9345cSTaylor Simpson{
8797cf9345cSTaylor Simpson    fHIDE(int i;)
8807cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
8817cf9345cSTaylor Simpson        fSETHALF(i,RdV,fSATN(16,fGETWORD(i,RssV)));
8827cf9345cSTaylor Simpson    }
8837cf9345cSTaylor Simpson})
8847cf9345cSTaylor Simpson
8857cf9345cSTaylor SimpsonQ6INSN(S2_vsatwuh,"Rd32=vsatwuh(Rss32)",ATTRIBS(),
8867cf9345cSTaylor Simpson"Vector saturate word to unsigned half",
8877cf9345cSTaylor Simpson{
8887cf9345cSTaylor Simpson    fHIDE(int i;)
8897cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
8907cf9345cSTaylor Simpson        fSETHALF(i,RdV,fSATUN(16,fGETWORD(i,RssV)));
8917cf9345cSTaylor Simpson    }
8927cf9345cSTaylor Simpson})
8937cf9345cSTaylor Simpson
8947cf9345cSTaylor Simpson/* Other misc insns of this type */
8957cf9345cSTaylor Simpson
8967cf9345cSTaylor SimpsonQ6INSN(S2_packhl,"Rdd32=packhl(Rs32,Rt32)",ATTRIBS(),
8977cf9345cSTaylor Simpson"Pack high halfwords and low halfwords together",
8987cf9345cSTaylor Simpson{
8997cf9345cSTaylor Simpson    fSETHALF(0,RddV,fGETHALF(0,RtV));
9007cf9345cSTaylor Simpson    fSETHALF(1,RddV,fGETHALF(0,RsV));
9017cf9345cSTaylor Simpson    fSETHALF(2,RddV,fGETHALF(1,RtV));
9027cf9345cSTaylor Simpson    fSETHALF(3,RddV,fGETHALF(1,RsV));
9037cf9345cSTaylor Simpson})
9047cf9345cSTaylor Simpson
9057cf9345cSTaylor SimpsonQ6INSN(A2_swiz,"Rd32=swiz(Rs32)",ATTRIBS(A_ARCHV2),
9067cf9345cSTaylor Simpson"Endian swap the bytes of Rs",
9077cf9345cSTaylor Simpson{
9087cf9345cSTaylor Simpson    fSETBYTE(0,RdV,fGETBYTE(3,RsV));
9097cf9345cSTaylor Simpson    fSETBYTE(1,RdV,fGETBYTE(2,RsV));
9107cf9345cSTaylor Simpson    fSETBYTE(2,RdV,fGETBYTE(1,RsV));
9117cf9345cSTaylor Simpson    fSETBYTE(3,RdV,fGETBYTE(0,RsV));
9127cf9345cSTaylor Simpson})
9137cf9345cSTaylor Simpson
9147cf9345cSTaylor Simpson
9157cf9345cSTaylor Simpson
9167cf9345cSTaylor Simpson/* Vector Sat without Packing */
9177cf9345cSTaylor SimpsonQ6INSN(S2_vsathub_nopack,"Rdd32=vsathub(Rss32)",ATTRIBS(),
9187cf9345cSTaylor Simpson"Vector saturate half to unsigned byte",
9197cf9345cSTaylor Simpson{
9207cf9345cSTaylor Simpson    fHIDE(int i;)
9217cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
9227cf9345cSTaylor Simpson        fSETHALF(i,RddV,fSATUN(8,fGETHALF(i,RssV)));
9237cf9345cSTaylor Simpson    }
9247cf9345cSTaylor Simpson})
9257cf9345cSTaylor Simpson
9267cf9345cSTaylor SimpsonQ6INSN(S2_vsathb_nopack,"Rdd32=vsathb(Rss32)",ATTRIBS(A_ARCHV2),
9277cf9345cSTaylor Simpson"Vector saturate half to signed byte without pack",
9287cf9345cSTaylor Simpson{
9297cf9345cSTaylor Simpson    fHIDE(int i;)
9307cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
9317cf9345cSTaylor Simpson        fSETHALF(i,RddV,fSATN(8,fGETHALF(i,RssV)));
9327cf9345cSTaylor Simpson    }
9337cf9345cSTaylor Simpson})
9347cf9345cSTaylor Simpson
9357cf9345cSTaylor SimpsonQ6INSN(S2_vsatwh_nopack,"Rdd32=vsatwh(Rss32)",ATTRIBS(),
9367cf9345cSTaylor Simpson"Vector saturate word to signed half",
9377cf9345cSTaylor Simpson{
9387cf9345cSTaylor Simpson    fHIDE(int i;)
9397cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
9407cf9345cSTaylor Simpson        fSETWORD(i,RddV,fSATN(16,fGETWORD(i,RssV)));
9417cf9345cSTaylor Simpson    }
9427cf9345cSTaylor Simpson})
9437cf9345cSTaylor Simpson
9447cf9345cSTaylor SimpsonQ6INSN(S2_vsatwuh_nopack,"Rdd32=vsatwuh(Rss32)",ATTRIBS(),
9457cf9345cSTaylor Simpson"Vector saturate word to unsigned half",
9467cf9345cSTaylor Simpson{
9477cf9345cSTaylor Simpson    fHIDE(int i;)
9487cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
9497cf9345cSTaylor Simpson        fSETWORD(i,RddV,fSATUN(16,fGETWORD(i,RssV)));
9507cf9345cSTaylor Simpson    }
9517cf9345cSTaylor Simpson})
9527cf9345cSTaylor Simpson
9537cf9345cSTaylor Simpson
9547cf9345cSTaylor Simpson/**********************************************/
9557cf9345cSTaylor Simpson/* Shuffle                                    */
9567cf9345cSTaylor Simpson/**********************************************/
9577cf9345cSTaylor Simpson
9587cf9345cSTaylor Simpson
9597cf9345cSTaylor SimpsonQ6INSN(S2_shuffob,"Rdd32=shuffob(Rtt32,Rss32)",ATTRIBS(),
9607cf9345cSTaylor Simpson"Shuffle high bytes together",
9617cf9345cSTaylor Simpson{
9627cf9345cSTaylor Simpson    fHIDE(int i;)
9637cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
9647cf9345cSTaylor Simpson        fSETBYTE(i*2  ,RddV,fGETBYTE(i*2+1,RssV));
9657cf9345cSTaylor Simpson        fSETBYTE(i*2+1,RddV,fGETBYTE(i*2+1,RttV));
9667cf9345cSTaylor Simpson    }
9677cf9345cSTaylor Simpson})
9687cf9345cSTaylor Simpson
9697cf9345cSTaylor SimpsonQ6INSN(S2_shuffeb,"Rdd32=shuffeb(Rss32,Rtt32)",ATTRIBS(),
9707cf9345cSTaylor Simpson"Shuffle low bytes together",
9717cf9345cSTaylor Simpson{
9727cf9345cSTaylor Simpson    fHIDE(int i;)
9737cf9345cSTaylor Simpson    for (i=0;i<4;i++) {
9747cf9345cSTaylor Simpson        fSETBYTE(i*2  ,RddV,fGETBYTE(i*2,RttV));
9757cf9345cSTaylor Simpson        fSETBYTE(i*2+1,RddV,fGETBYTE(i*2,RssV));
9767cf9345cSTaylor Simpson    }
9777cf9345cSTaylor Simpson})
9787cf9345cSTaylor Simpson
9797cf9345cSTaylor SimpsonQ6INSN(S2_shuffoh,"Rdd32=shuffoh(Rtt32,Rss32)",ATTRIBS(),
9807cf9345cSTaylor Simpson"Shuffle high halves together",
9817cf9345cSTaylor Simpson{
9827cf9345cSTaylor Simpson    fHIDE(int i;)
9837cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
9847cf9345cSTaylor Simpson        fSETHALF(i*2  ,RddV,fGETHALF(i*2+1,RssV));
9857cf9345cSTaylor Simpson        fSETHALF(i*2+1,RddV,fGETHALF(i*2+1,RttV));
9867cf9345cSTaylor Simpson    }
9877cf9345cSTaylor Simpson})
9887cf9345cSTaylor Simpson
9897cf9345cSTaylor SimpsonQ6INSN(S2_shuffeh,"Rdd32=shuffeh(Rss32,Rtt32)",ATTRIBS(),
9907cf9345cSTaylor Simpson"Shuffle low halves together",
9917cf9345cSTaylor Simpson{
9927cf9345cSTaylor Simpson    fHIDE(int i;)
9937cf9345cSTaylor Simpson    for (i=0;i<2;i++) {
9947cf9345cSTaylor Simpson        fSETHALF(i*2  ,RddV,fGETHALF(i*2,RttV));
9957cf9345cSTaylor Simpson        fSETHALF(i*2+1,RddV,fGETHALF(i*2,RssV));
9967cf9345cSTaylor Simpson    }
9977cf9345cSTaylor Simpson})
9987cf9345cSTaylor Simpson
9997cf9345cSTaylor Simpson
10007cf9345cSTaylor Simpson/**********************************************/
10017cf9345cSTaylor Simpson/* Strange bit instructions                   */
10027cf9345cSTaylor Simpson/**********************************************/
10037cf9345cSTaylor Simpson
10047cf9345cSTaylor SimpsonQ6INSN(S5_popcountp,"Rd32=popcount(Rss32)",ATTRIBS(),
10057cf9345cSTaylor Simpson"Population Count", { RdV = fCOUNTONES_8(RssV); })
10067cf9345cSTaylor Simpson
10077cf9345cSTaylor SimpsonQ6INSN(S4_parity,"Rd32=parity(Rs32,Rt32)",,
10087cf9345cSTaylor Simpson"Parity of Masked Value", { RdV = 1&fCOUNTONES_4(RsV & RtV); })
10097cf9345cSTaylor Simpson
10107cf9345cSTaylor SimpsonQ6INSN(S2_parityp,"Rd32=parity(Rss32,Rtt32)",ATTRIBS(A_ARCHV2),
10117cf9345cSTaylor Simpson"Parity of Masked Value", { RdV = 1&fCOUNTONES_8(RssV & RttV); })
10127cf9345cSTaylor Simpson
10137cf9345cSTaylor SimpsonQ6INSN(S2_lfsp,"Rdd32=lfs(Rss32,Rtt32)",ATTRIBS(A_ARCHV2),
10147cf9345cSTaylor Simpson"Parity of Masked Value", { RddV = (fCAST8u(RssV) >> 1) | (fCAST8u((1&fCOUNTONES_8(RssV & RttV)))<<63) ; })
10157cf9345cSTaylor Simpson
10167cf9345cSTaylor SimpsonQ6INSN(S2_clbnorm,"Rd32=normamt(Rs32)",ATTRIBS(A_ARCHV2),
10177cf9345cSTaylor Simpson"Count leading sign bits - 1", { if (RsV == 0) { RdV = 0; } else { RdV = (fMAX(fCL1_4(RsV),fCL1_4(~RsV)))-1;} })
10187cf9345cSTaylor Simpson
10197cf9345cSTaylor SimpsonQ6INSN(S4_clbaddi,"Rd32=add(clb(Rs32),#s6)",ATTRIBS(A_ARCHV2),
10207cf9345cSTaylor Simpson"Count leading sign bits then add signed number",
10217cf9345cSTaylor Simpson{ RdV = (fMAX(fCL1_4(RsV),fCL1_4(~RsV)))+siV;} )
10227cf9345cSTaylor Simpson
10237cf9345cSTaylor SimpsonQ6INSN(S4_clbpnorm,"Rd32=normamt(Rss32)",ATTRIBS(A_ARCHV2),
10247cf9345cSTaylor Simpson"Count leading sign bits - 1", { if (RssV == 0) { RdV = 0; }
10257cf9345cSTaylor Simpsonelse { RdV = (fMAX(fCL1_8(RssV),fCL1_8(~RssV)))-1;}})
10267cf9345cSTaylor Simpson
10277cf9345cSTaylor SimpsonQ6INSN(S4_clbpaddi,"Rd32=add(clb(Rss32),#s6)",ATTRIBS(A_ARCHV2),
10287cf9345cSTaylor Simpson"Count leading sign bits then add signed number",
10297cf9345cSTaylor Simpson{ RdV = (fMAX(fCL1_8(RssV),fCL1_8(~RssV)))+siV;})
10307cf9345cSTaylor Simpson
10317cf9345cSTaylor Simpson
1032*e628c015STaylor Simpson
1033*e628c015STaylor SimpsonQ6INSN(S2_cabacdecbin,"Rdd32=decbin(Rss32,Rtt32)",ATTRIBS(A_ARCHV3),"CABAC decode bin",
1034*e628c015STaylor Simpson{
1035*e628c015STaylor Simpson    fHIDE(size4u_t state;)
1036*e628c015STaylor Simpson    fHIDE(size4u_t valMPS;)
1037*e628c015STaylor Simpson    fHIDE(size4u_t bitpos;)
1038*e628c015STaylor Simpson    fHIDE(size4u_t range;)
1039*e628c015STaylor Simpson    fHIDE(size4u_t offset;)
1040*e628c015STaylor Simpson    fHIDE(size4u_t rLPS;)
1041*e628c015STaylor Simpson    fHIDE(size4u_t rMPS;)
1042*e628c015STaylor Simpson
1043*e628c015STaylor Simpson    state =  fEXTRACTU_RANGE( fGETWORD(1,RttV) ,5,0);
1044*e628c015STaylor Simpson    valMPS = fEXTRACTU_RANGE( fGETWORD(1,RttV) ,8,8);
1045*e628c015STaylor Simpson    bitpos = fEXTRACTU_RANGE( fGETWORD(0,RttV) ,4,0);
1046*e628c015STaylor Simpson    range =  fGETWORD(0,RssV);
1047*e628c015STaylor Simpson    offset = fGETWORD(1,RssV);
1048*e628c015STaylor Simpson
1049*e628c015STaylor Simpson    /* calculate rLPS */
1050*e628c015STaylor Simpson    range <<= bitpos;
1051*e628c015STaylor Simpson    offset <<= bitpos;
1052*e628c015STaylor Simpson    rLPS = rLPS_table_64x4[state][ (range >>29)&3];
1053*e628c015STaylor Simpson    rLPS  = rLPS << 23;   /* left aligned */
1054*e628c015STaylor Simpson
1055*e628c015STaylor Simpson    /* calculate rMPS */
1056*e628c015STaylor Simpson    rMPS= (range&0xff800000) - rLPS;
1057*e628c015STaylor Simpson
1058*e628c015STaylor Simpson    /* most probable region */
1059*e628c015STaylor Simpson    if (offset < rMPS) {
1060*e628c015STaylor Simpson        RddV = AC_next_state_MPS_64[state];
1061*e628c015STaylor Simpson        fINSERT_RANGE(RddV,8,8,valMPS);
1062*e628c015STaylor Simpson        fINSERT_RANGE(RddV,31,23,(rMPS>>23));
1063*e628c015STaylor Simpson        fSETWORD(1,RddV,offset);
1064*e628c015STaylor Simpson        fWRITE_P0(valMPS);
1065*e628c015STaylor Simpson
1066*e628c015STaylor Simpson
1067*e628c015STaylor Simpson    }
1068*e628c015STaylor Simpson    /* least probable region */
1069*e628c015STaylor Simpson    else {
1070*e628c015STaylor Simpson        RddV = AC_next_state_LPS_64[state];
1071*e628c015STaylor Simpson        fINSERT_RANGE(RddV,8,8,((!state)?(1-valMPS):(valMPS)));
1072*e628c015STaylor Simpson        fINSERT_RANGE(RddV,31,23,(rLPS>>23));
1073*e628c015STaylor Simpson        fSETWORD(1,RddV,(offset-rMPS));
1074*e628c015STaylor Simpson        fWRITE_P0((valMPS^1));
1075*e628c015STaylor Simpson    }
1076*e628c015STaylor Simpson})
1077*e628c015STaylor Simpson
1078*e628c015STaylor Simpson
10797cf9345cSTaylor SimpsonQ6INSN(S2_clb,"Rd32=clb(Rs32)",ATTRIBS(),
10807cf9345cSTaylor Simpson"Count leading bits", {RdV = fMAX(fCL1_4(RsV),fCL1_4(~RsV));})
10817cf9345cSTaylor Simpson
10827cf9345cSTaylor Simpson
10837cf9345cSTaylor SimpsonQ6INSN(S2_cl0,"Rd32=cl0(Rs32)",ATTRIBS(),
10847cf9345cSTaylor Simpson"Count leading bits", {RdV = fCL1_4(~RsV);})
10857cf9345cSTaylor Simpson
10867cf9345cSTaylor SimpsonQ6INSN(S2_cl1,"Rd32=cl1(Rs32)",ATTRIBS(),
10877cf9345cSTaylor Simpson"Count leading bits", {RdV = fCL1_4(RsV);})
10887cf9345cSTaylor Simpson
10897cf9345cSTaylor SimpsonQ6INSN(S2_clbp,"Rd32=clb(Rss32)",ATTRIBS(),
10907cf9345cSTaylor Simpson"Count leading bits", {RdV = fMAX(fCL1_8(RssV),fCL1_8(~RssV));})
10917cf9345cSTaylor Simpson
10927cf9345cSTaylor SimpsonQ6INSN(S2_cl0p,"Rd32=cl0(Rss32)",ATTRIBS(),
10937cf9345cSTaylor Simpson"Count leading bits", {RdV = fCL1_8(~RssV);})
10947cf9345cSTaylor Simpson
10957cf9345cSTaylor SimpsonQ6INSN(S2_cl1p,"Rd32=cl1(Rss32)",ATTRIBS(),
10967cf9345cSTaylor Simpson"Count leading bits", {RdV = fCL1_8(RssV);})
10977cf9345cSTaylor Simpson
10987cf9345cSTaylor Simpson
10997cf9345cSTaylor Simpson
11007cf9345cSTaylor Simpson
11017cf9345cSTaylor SimpsonQ6INSN(S2_brev, "Rd32=brev(Rs32)",   ATTRIBS(A_ARCHV2), "Bit Reverse",{RdV = fBREV_4(RsV);})
11027cf9345cSTaylor SimpsonQ6INSN(S2_brevp,"Rdd32=brev(Rss32)", ATTRIBS(), "Bit Reverse",{RddV = fBREV_8(RssV);})
11037cf9345cSTaylor SimpsonQ6INSN(S2_ct0,  "Rd32=ct0(Rs32)",    ATTRIBS(A_ARCHV2), "Count Trailing",{RdV = fCL1_4(~fBREV_4(RsV));})
11047cf9345cSTaylor SimpsonQ6INSN(S2_ct1,  "Rd32=ct1(Rs32)",    ATTRIBS(A_ARCHV2), "Count Trailing",{RdV = fCL1_4(fBREV_4(RsV));})
11057cf9345cSTaylor SimpsonQ6INSN(S2_ct0p, "Rd32=ct0(Rss32)",   ATTRIBS(), "Count Trailing",{RdV = fCL1_8(~fBREV_8(RssV));})
11067cf9345cSTaylor SimpsonQ6INSN(S2_ct1p, "Rd32=ct1(Rss32)",   ATTRIBS(), "Count Trailing",{RdV = fCL1_8(fBREV_8(RssV));})
11077cf9345cSTaylor Simpson
11087cf9345cSTaylor Simpson
11097cf9345cSTaylor SimpsonQ6INSN(S2_interleave,"Rdd32=interleave(Rss32)",ATTRIBS(A_ARCHV2),"Interleave bits",
11107cf9345cSTaylor Simpson{RddV = fINTERLEAVE(fGETWORD(1,RssV),fGETWORD(0,RssV));})
11117cf9345cSTaylor Simpson
11127cf9345cSTaylor SimpsonQ6INSN(S2_deinterleave,"Rdd32=deinterleave(Rss32)",ATTRIBS(A_ARCHV2),"Interleave bits",
11137cf9345cSTaylor Simpson{RddV = fDEINTERLEAVE(RssV);})
1114