Hexagon 处理器为处理标量和矢量数据提供了丰富的操作集。
本章概述了以下 Hexagon 处理器指令类提供的操作:
注意 有关这些指令类的详细说明,请参见第 11 章。
Hexagon 处理器提供用于处理以下数据类型的操作:
Hexagon 处理器提供处理 8 位、16 位、32 位或 64 位定点数据的操作。 数据可以是整数或小数,也可以是有符号或无符号格式。
Hexagon 处理器提供处理 32 位浮点数的操作。 这些数字以 IEEE 单精度浮点格式存储。
根据 IEEE 标准,某些浮点值被定义为表示正无穷或负无穷,以及非数字 (NaN),它表示没有数学意义的值。
浮点数可以保存在通用寄存器中。
Hexagon 处理器提供处理 32 位或 64 位复数数据的操作。
复数包括有符号实部和有符号虚部。 给定两个复数 (a+bi) 和 (c+di),复数乘法运算在一条指令中计算实部 (ac-bd) 和虚部 (ad+bc)。
复数可以打包在一个通用寄存器或寄存器对中。 打包后,虚数部分占据寄存器或寄存器对的最高有效部分。
Hexagon 处理器提供处理 64 位矢量数据的操作。
矢量数据类型将多个数据项(字节、半字或字)打包到 64 位寄存器中。 矢量数据操作在视频和图像处理中很常见。
八个 8 位字节可以打包到一个 64 位寄存器中。
图 4-1 显示了向量字节操作的示例。
图 4-1 向量字节操作
四个 16 位半字值可以打包在一个 64 位寄存器对中。
图 4-2 显示了向量半字操作的示例。
图 4-2 向量半字操作
两个 32 位字值可以打包在一个 64 位寄存器对中。
图 4-3 显示了向量字操作的示例。
图 4-3 向量字操作
一些指令支持可选的缩放、饱和度和舍入。 没有控制这些选项的模式位 - 相反,它们被明确指定为指令名称的一部分。 本节介绍了这些选项。
在小数数据格式中,数据被视为定点小数值,其范围由字长和小数点位置确定。
通过添加 :<<1 说明符在指令中指定分数缩放。 例如:
R3:2 = cmpy(R0,R1):<<1:sat
当两个小数相乘时,必须对乘积进行缩放以恢复原始的小数数据格式。 Hexagon 处理器允许在指令中为 0 和 1 的移位指定乘积的分数缩放。对于 Q1.15 数字应该进行 1 的移位,而对于整数乘法应该进行 0 的移位。
某些指令以饱和形式提供。 如果饱和算术指令的结果小于最小值,则将结果设置为最小值。 类似地,如果运算的结果大于最大值,则将结果设置为最大值。
通过添加 :sat 说明符在指令中指定饱和度。 例如:
R2 = abs(R1):sat
每当饱和操作饱和到最大值或最小值时,用户状态寄存器(第 2.2.3 节)中的 OVF 位就会置位。 它一直保持设置,直到被控制寄存器传输到 USR 明确清除。 对于向量类型的饱和操作,如果向量的任何单个元素饱和,则设置 OVF。
某些有符号乘法指令支持可选的算术舍入(也称为偏置舍入)。 算术舍入运算采用双精度小数值并将 0x8000 添加到低 16 位(最低有效 16 位半字)。
通过添加 :rnd 说明符在指令中指定舍入。 例如:
R2 = mpy(R1.h,R2.h):rnd
注意 算术舍入会累积数值误差,尤其是当要舍入的数字恰好为 0.5 时。 当除以 2 或平均时,这种情况最常发生。
为了解决算术舍入中的误差累积问题(第 4.2.3 节),Hexagon 处理器包含四个指令,这些指令通过收敛舍入选项支持正负平均。
这些说明的工作方式如下:
在 Hexagon 处理器上,浮点除法和平方根运算是使用库函数在软件中实现的。 为了能够有效地执行这些操作,处理器支持乘法累加指令的特殊变体。 这些被命名为比例 FMA。
缩放 FMA 支持对浮点融合乘加指令生成的乘积进行可选缩放。
通过添加 :scale 说明符和谓词寄存器操作数在指令中指定缩放。 例如:
R3 += sfmpy(R0,R1,P2):scale
对于单精度,比例因子是 2 到谓词寄存器内容指定的幂(被视为 8 位二进制补码值)。 对于双精度,谓词寄存器值在用作 2 的幂之前加倍。
注意 Scale FMA 指令不应在除法和平方根库例程之外使用。 不保证 Hexagon 处理器的未来版本将使用相同的语义实现这些指令。 未来的版本仅假定缩放 FMA 的兼容性仅限于除法和平方根库例程的需要。