Hexagon处理器的一些特殊操作
Hexagon处理器的一些特殊操作 Arithmetic decoding for one bin 在H.264中,范围有9位长,而偏移量在一般模式下占9位,在触发模式下有10位。rLPS的计算大约是根据64*4个256比特,范围与上下文状态在地址中定义用来检查表格。为了保持整个解码过程的精度,新的范围必须被重归一化从而保证最重要的那一位为1.而且偏移能从比特流中异步填充,为了简化重归一化以及重填充过程,下面的解码框图可以显著的减少重归一化和重填充的频率,这也能使DSP的实现更加简单。 通过使用decbin指令,Hexagon处理器可以在两个周期内解码一个常用的二进制 例如: INPUT: Rss and Rtt register pairs as:
Rtt.w1[5:0] = state
Rtt.w1[8] = valMPS
Rtt.w0[4:0] = bitpos
Rss.w0 = range
Rss.w1 = offset
OUTPUT: Rdd register pair is packed as
Rdd.w0[5:0] = state
Rdd.w0[8] = valMPS
Rdd.w0[31:23] = range
Rdd.w0[22:16] = '0'
Rdd.w1 = offset (normalized)
OUTPUT: P0
P0 = (bin)
代码展示: /**************************************************************** * Non-conventional call:
* 输入: R1:0 = 偏移量 : 范围,R2 = dep,R3 = ctxIdx,* R4 = (*ctxIdx),R5 = bitpos
* * Return:
* R1: 0 - offset : range
* P0 - (bin)
*****************************************************************/
// Cycle #1
{ R1:0= decbin(R1:0,R5:4) // 解码一个二进制
R6 = asl(R22,R5) // 此处 R22 = 0x100
}
// Cycle #2
{ memb(R3) = R0 // 将上下文保存至 *ctxIdx
R1:0 = vlsrw(R1:0,R5) // 重新对其范围以及偏移量
P1 = cmp.gtu(R6,R1) //是否需要重填充? i.e.,P1= (range<0x100) IF (!P1.new) jumpr:t LR // return }
IP 网络总和校验码 .text
.global fast_ip_check
// 假设数据为八位对其
// 输入R0指向数据
// 输入R1代表数据长度
// 在R0中返回数据
fast_ip_check:
{
R1 = lsr(R1,#4) // 16字节块
R9:8 = combine(#0,#0)
R3:2 = combine(#0,#0)
}
{ loop0(1f,R1) R7:6 = memd(R0+#8)
R5:4 = memd(R0++#16)
} .falign 1:
{
R7:6 = memd(R0+#8)
R5:4 = memd(R0++#16)
R2 = vradduh(R5:4,R7:6) // 累加半字节
R8 = vradduh(R3:2,R9:8)
}: endloop 0
// drain pipeline
{R2 = vradduh(R5:4,R7:6)
R8 = vradduh(R3:2,R9:8)
R5:4 = combine(#0,#0)}
{R8 = vradduh(R3:2,R9:8)
R1 = #0}
{R0 = vradduh(R5:4,R9:8)}
{R0 = vradduh(R5:4,R1:0)}
{R0 = not(R0) jumpr LR }
软件无线电 多项式操作 多项式乘法指令支持如下的选项 ? Scramble指令生成 ? 加密算法 ? CRC检验 ? 卷积编码 ? RS码 这种指令的四个版本都支持32X32以及向量16x16位的乘法 下图显示了pmpy指令的操作信息 Rxx += vpmpyh(Rs,Rt) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |