Hexagon (target/hexagon) CABAC decode bin

The following instruction is added
    S2_cabacdecbin            Rdd32=decbin(Rss32,Rtt32)

Test cases added to tests/tcg/hexagon/misc.c

Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <1617930474-31979-27-git-send-email-tsimpson@quicinc.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Taylor Simpson 2021-04-08 20:07:54 -05:00 committed by Richard Henderson
parent 7aa9ffab79
commit e628c0156b
7 changed files with 193 additions and 0 deletions

View file

@ -1767,6 +1767,7 @@ SH_RRR_ENC(S4_vxsubaddh, "0001","01-","-","110","ddddd")
SH_RRR_ENC(S4_vxaddsubhr, "0001","11-","-","00-","ddddd")
SH_RRR_ENC(S4_vxsubaddhr, "0001","11-","-","01-","ddddd")
SH_RRR_ENC(S4_extractp_rp, "0001","11-","-","10-","ddddd")
SH_RRR_ENC(S2_cabacdecbin, "0001","11-","-","11-","ddddd") /* implicit P0 write */
DEF_FIELDROW_DESC32(ICLASS_S3op" 0010 -------- PP------ --------","[#2] Rdd=(Rss,Rtt,Pu)")

View file

@ -92,6 +92,21 @@ DEF_MACRO(
/* attribs */
)
DEF_MACRO(
fINSERT_RANGE,
{
int offset=LOWBIT;
int width=HIBIT-LOWBIT+1;
/* clear bits where new bits go */
INREG &= ~(((fCONSTLL(1)<<width)-1)<<offset);
/* OR in new bits */
INREG |= ((INVAL & ((fCONSTLL(1)<<width)-1)) << offset);
},
/* attribs */
)
DEF_MACRO(
f8BITSOF,
( (VAL) ? 0xff : 0x00),

View file

@ -1029,6 +1029,53 @@ Q6INSN(S4_clbpaddi,"Rd32=add(clb(Rss32),#s6)",ATTRIBS(A_ARCHV2),
{ RdV = (fMAX(fCL1_8(RssV),fCL1_8(~RssV)))+siV;})
Q6INSN(S2_cabacdecbin,"Rdd32=decbin(Rss32,Rtt32)",ATTRIBS(A_ARCHV3),"CABAC decode bin",
{
fHIDE(size4u_t state;)
fHIDE(size4u_t valMPS;)
fHIDE(size4u_t bitpos;)
fHIDE(size4u_t range;)
fHIDE(size4u_t offset;)
fHIDE(size4u_t rLPS;)
fHIDE(size4u_t rMPS;)
state = fEXTRACTU_RANGE( fGETWORD(1,RttV) ,5,0);
valMPS = fEXTRACTU_RANGE( fGETWORD(1,RttV) ,8,8);
bitpos = fEXTRACTU_RANGE( fGETWORD(0,RttV) ,4,0);
range = fGETWORD(0,RssV);
offset = fGETWORD(1,RssV);
/* calculate rLPS */
range <<= bitpos;
offset <<= bitpos;
rLPS = rLPS_table_64x4[state][ (range >>29)&3];
rLPS = rLPS << 23; /* left aligned */
/* calculate rMPS */
rMPS= (range&0xff800000) - rLPS;
/* most probable region */
if (offset < rMPS) {
RddV = AC_next_state_MPS_64[state];
fINSERT_RANGE(RddV,8,8,valMPS);
fINSERT_RANGE(RddV,31,23,(rMPS>>23));
fSETWORD(1,RddV,offset);
fWRITE_P0(valMPS);
}
/* least probable region */
else {
RddV = AC_next_state_LPS_64[state];
fINSERT_RANGE(RddV,8,8,((!state)?(1-valMPS):(valMPS)));
fINSERT_RANGE(RddV,31,23,(rLPS>>23));
fSETWORD(1,RddV,(offset-rMPS));
fWRITE_P0((valMPS^1));
}
})
Q6INSN(S2_clb,"Rd32=clb(Rs32)",ATTRIBS(),
"Count leading bits", {RdV = fMAX(fCL1_4(RsV),fCL1_4(~RsV));})