XTYPE指令类包括执行的大多数数据处理操作,通过Hexagon处理器,这些操作按其操作类型分类:
ALU操作修改8位、16位、32位和64位数据。这些操作包括:
有关更多信息,请参阅第11.1.1节和第11.10.1节。
位操作操作修改寄存器或寄存器对中的位字段。这些操作包括:
有关更多信息,请参阅第11.10.2节
复数运算处理复数。这些操作包括:
有关更多信息,请参阅第11.10.3节
浮点运算处理单精度浮点数。这些操作包括:
Hexagon处理器的浮点运算符合IEEE标准。但是例如IEEE的某些要求不被直接支持,例如除法和平凡根。取而代之的是我们定义了特殊的指令来支持实现这些操作所需要的库,例如:
有关更多信息,请参阅第11.10.4节
注意:特殊浮点指令不直接用于用户代码–它们只能在浮点库中使用
浮点转换指令sfmake和dfmake转换无符号10位立即数值转换为相应的浮点值。
必须对立即值
进行编码,使位[5:0]包含有效位,位[9:6]指数将指数值添加到初始指数值(偏差 - 6)。
例如,要生成单精度浮点值2.0,位[5:0]必须为设置为0,位[9:6]设置为7。对该立即值
执行sfmake得到浮点值0x40000000,即2.0
注意:转换指令旨在处理常见的浮点值,包括大多数整数和许多基本分数(1/2、3/4等)。
Hexagon 用户状态寄存器(第2.2.3节)包括FPRND字段,用于指定IEEE定义的浮点舍入模式
Hexagon用户状态寄存器(第2.2.3节)包括五个状态字段,作为IEEE定义的五种异常条件的粘性标志:不精确、溢出、下溢、除以零和无效。当相应的异常发生时,设置粘性标志,并保持设置,直到显式清除。
用户状态寄存器还包括五个模式字段,用于指定如果其中一个浮点异常,则应执行操作系统陷阱发生。对于包含浮点操作的每个指令包,如果同时设置了浮点粘性标志和相应的陷阱启用位,则为浮点陷阱生成。在数据包提交后,Hexagon处理器会自动扔给操作系统。
注意:非浮点指令从不生成浮点陷阱,不管粘性标志和陷阱启用位的状态如何
乘法运算支持定点乘法,包括单精度乘法
和双精度乘法
以及多项式乘法
。
在单精度算术中,一个16位值乘以另一个16位值。这些操作数可以来自任何寄存器的高位或低位。取决于指令,16的结果 16操作可以选择累加、饱和、舍入或左移0-1位。
指令集支持对 有符号 x 有符号、无符号 x 无符号,有符号 x 无符号数据。
表 4-1 总结了 16 x 16 单精度乘法的可用操作。
表中使用的符号如下:
有符号 x 有符号
乘法无符号 x 无符号
乘法有符号 x 无符号
乘法双精度指令可用于32 x 32
和32 x 16
乘法:
操作数可以是有符号的,也可以是无符号的。
表4-2总结了双精度乘法中可用的选项
表4-2 双精度乘法操作
多项式乘法指令可用于字和向量半字。
这些指令对许多算法都很有用,包括扰码生成,密码算法、卷积码和里德-所罗门码。
有关乘法运算的更多信息,请参阅第11.10.5节
置换操作对矢量数据执行各种操作,包括算术、格式转换和矢量元素的重新排列。
多种类型的转换可支持:
有关更多信息,请参阅第11.1.2节和第11.10.6节。
断言操作修改断言源数据。可用声明的类别包括:
有关更多信息,请参阅第11.1.3节和第11.10.7节
标量移位操作执行各种32位和64位移位,然后执行可选的添加/订阅或逻辑操作。图4-4显示了常规操作
图 4-4
支持四种换档类型:
在基于寄存器的移位中,Rt寄存器是一个有符号的二补数。如果此值为正,则指令操作码指示移位方向(向右或向左)。如果这个值为负,则操作码指示的移位方向反转。
当执行算术右移时,符号位移入,而逻辑右移移位以零移位。左移位总是以零移位。
有些偏移可以使用饱和度和舍入选项。
有关更多信息,请参阅第11.10.8节
ALU32指令类包括对32位数据的一般算术/逻辑运算:
关更多信息,请参阅第11.1节。
注ALU32指令可以在任何插槽上执行(第3.3.3节)。第6章描述了条件执行和比较指令
矢量运算支持对字节、半字和字的向量进行算术运算。
向量运算属于XTYPE指令类(除了向量加法,减法和平均半字,即ALU32)。
向量字节操作处理有符号或无符号字节的压缩向量。他们包括以下操作:
矢量半字运算处理压缩16位半字。它们包括以下操作:
例如,图4-5显示了向量算术右半字移位的操作(vasrh)说明。在该指令中,每个16位半字右移相同的长度在寄存器中指定或具有立即数的量。因为这个转变是算术中,移入的位是符号位的副本。
向量字运算处理两个字的压缩向量。它们包括以下操作:
有关矢量运算的更多信息,请参阅第11.1.1节和第11.10.1节
CR指令类包括访问控制寄存器的操作(第2.2节)。
表4-3列出了访问控制寄存器的指令。
注:在寄存器对传输中,必须使用其数字别名–有关详细信息,请参阅第2.2节。 有关更多信息,请参阅第11.2节
指令集包括许多执行多个逻辑或的指令
单个指令中的算术运算。它们包括以下操作:
有关更多信息,请参阅第11.10.1节
指令集包括许多专用指令,以支持特定的应用:
H.264/AVC被广泛应用于各种多媒体应用中:
上下文自适应二进制算术编码(CABAC)是两种备选方案之一H.264主配置文件中规定的熵编码方法。CABAC提供卓越的以更大的计算复杂度为代价提高编码效率。Hexagon处理器包括一个专用指令(decbin),以支持CABAC解码。
二进制算术编码基于递归区间细分原理,其状态由两个量表示:
从编码比特流读取偏移量。解码箱子时,间隔范围为根据LPS概率PLP的估计细分为两个区间:一个宽度为rLPS=范围x pLPS的间隔,以及宽度为rMPS=范围x的间隔pMPS=范围-rLPS,其中LPS表示最小可能符号,MPS表示最大可能符号
可能符号。
根据偏移量属于哪个子区间,解码器决定是否使用二进制编码解码为MPS或LPS,然后迭代更新这两个量,如图4-1中所示
在H.264中,偏移量为9位,在常规模式下为9位,在旁路模式下为10位模式。rLPS的计算近似为64×4 256字节的表格,其中范围和上下文状态(为要访问的bin选择解码)用于处理查找表。保持整体精度解码过程中,必须对新的范围进行重整,以确保最显著的位始终为1,偏移量从位流同步重新填充。
为了简化重整化/重新填充过程,中所示的解码方案图4-2是为了显著降低重整化频率和从位流中重新填充位,同时也适用于DSP实现。
通过使用decbin指令,Hexagon处理器能够解码一个常规bin在2个循环中(不包括箱子重新填充过程)。
有关decbin指令的更多信息,请参阅第11.10.6节
例子:
Rdd = decbin(Rss,Rtt)
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)
H264CabacGetBinNC:
/****************************************************************
* Non-conventional call:
* Input: R1:0 = offset : range , R2 = dep, R3 = ctxIdx,
* R4 = (*ctxIdx), R5 = bitpos
*
* Return:
* R1: 0 - offset : range
* P0 - (bin)
*****************************************************************/
// Cycle #1
{ R1:0= decbin(R1:0,R5:4) // decoding one bin
R6 = asl(R22,R5) // where R22 = 0x100
}
// Cycle #2
{ memb(R3) = R0 // save context to *ctxIdx
R1:0 = vlsrw(R1:0,R5) // re-align range and offset
P1 = cmp.gtu(R6,R1) // need refill? i.e., P1= (range<0x100)
IF (!P1.new) jumpr:t LR // return
}
RENORM_REFILL:
internet checksum(See RFC 1071 (http://www.faqs.org/rfcs/rfc1071.html)
)的主要功能包括:
使用标准的数据处理指令,互联网校验和可以计算为8通过加载字并累积为双字,主循环中每个周期的字节数。在循环之后,上部单词被添加到下部单词;那么上半字是添加到下半字,所有进位都添加回。
Hexagon处理器支持专用指令(vradduh),该指令支持以每周期16字节的速率计算互联网校验和。vradduh指令接受两个输入向量的半字,将它们全部相加并将结果放入32位目标寄存器。可以使用此操作用于在保留进位的同时计算16字节输入的总和,以及计算结束时累积进位。
有关vradduh指令的更多信息,请参阅第11.10.1节。
注意:此操作利用了Hexagon处理器中可用的最大负载带宽。
.text
.global fast_ip_check
// Assumes data is 8-byte aligned
// Assumes data is padded at least 16 bytes afterwords with 0's.
// input R0 points to data
// input R1 is length of data
// returns IP checksum in R0
fast_ip_check:
{
R1 = lsr(R1,#4) // 16-byte chunks, rounded down, +1
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) // accumulate 8 halfwords
R8 = vradduh(R3:2,R9:8) // accumulate carries
}:endloop0
// 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
}
// may have some carries to add back in
{
R0 = vradduh(R5:4,R9:8)
}
// possible for one more to pop out
{
R0 = vradduh(R5:4,R1:0)
}
{
R0 = not(R0)
jumpr LR
}
Hexagon处理器包括六条专用指令,它们支持软件无线电的实现。这些指令大大加快了以下算法:
解扩中的一个基本操作是PN乘法操作。在此操作中将接收到的复码片与QAM的伪随机序列进行比较星座点和累积点。
图4-3显示了用于执行此操作的vrcrotate指令。这个乘积相加形成软32位复数符号。该指令具有两种功能累积和非累积版本
有关vrcrotate指令的更多信息,请参阅第11.10.3节。
注:使用此指令,Hexagon 处理器可以每周期处理5.3个芯片,一个12指WCDMA用户只需要15兆赫。
多项式乘法指令支持以下操作:
该指令的四个版本都支持32 x 32和向量16 x 16乘法有无堆积,如图4-4所示。
有关pmpy说明的更多信息,请参阅第11.10.5节。