mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
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:
parent
7aa9ffab79
commit
e628c0156b
7 changed files with 193 additions and 0 deletions
|
@ -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)")
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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));})
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue