目录
5.3.5 结果饱和度
5.3.4 乘法饱和度
5.3.5 乘法后移位
5.3.6 标量浮点支持
5.3.7 复数支持
5.3.7.1 16位复杂算法支持
5.3.7.2 32位复杂算法支持
5.4 SPU算术标志
5.4.1 进位标志
5.4.2 溢出标志
5.4.3 限制标志
5.4.4 除以0标志
SPU支持在与加法、减法、移位和乘法相关的指令中自动饱和计算结果。饱和操作使SPU能够将计算结果的值限制为目标寄存器和数据类型可以表示的最小或最大值。当结果的值不能由寄存器的类型表示时,饱和应用于有符号和无符号结果。
表 5-2 列出了支持的寄存器类型的饱和值。
表5-2.饱和度值
寄存器类型 |
最小值 |
最大值 |
Signed Char – rZ.c |
-128 |
127 |
Signed Short – rZ(p).s(2) |
-32,768 |
32,767 |
Signed int – rZ.i |
-2,147,483,648 |
2,147,483,647 |
Unsigned Char – rZ.uc |
0 |
255 |
Unsigned Short – rZ(p).us(2) |
0 |
65,535 |
Unsigned int – rZ.ui |
0 |
4,294,967,295 |
在支持的情况下,可以通过程序集语法中的{sat}开关应用饱和。当应用饱和时,处理器自动断言限制标志(见第5.4.3节,限制标志)。注意:long long(64位)类型变量不支持饱和。
当被乘数等于由类型(短和整数)表示的最小有符号值,并且作为操作的一部分执行1的左移位时,某些乘法指令可以使乘积饱和,如中所述。表5-3
表5-3.产品饱和度
多进制类型 |
饱和情况 |
饱和值(移位后) |
Short (signed 16 bits) |
0x8000 x 0x8000 |
0x7FFF |
Integer (signed 32 bits) |
0x80000000 x 0x800000000 |
0x7FFFFFFF |
乘法饱和度是为支持{psat}开关的指令指定的。{psl1}开关激活左移1,并且需要{psat}才能生效。
对于使用{sat}开关的结果饱和度,独立地选择和执行产品饱和度。
注:总移位量也受SAMR寄存器中指定的右移位规范的影响,例5-2 演示左移1的产品饱和度。
例5-2.左移1的产品饱和度
mpy{psl1,psat}r1h.s2,r2h.s2、r3.i (0x8000 x 0x8000)<<1=0x7fffffff |
当应用饱和时,处理器自动断言限制标志(有关更多详细信息,请参阅第5.4.3节,限制标志)。
涉及乘法的指令(如mpy、mac等)可以将乘法结果向左移位1位,或向右移位多达32位。移位发生在后续操作之前,例如舍入、饱和和累加。执行多个乘法的指令(如mad、mpycx、mac3等)对每个乘法结果执行移位。
乘法后移位的方向和量由左右贡献因子的总和确定,并受编译选项和SAMR寄存器中sv字段的值的影响:
通过指定{ns}或{rndns}编译开关,可以禁用右移贡献(设置为0)。
当{psl1}用非零右移贡献激活时,总移位贡献是右移贡献减去1。这意味着,只有当右移位被禁用或等于0时,才能发生左移位。
根据IEEE-754标准,SPU支持可选的浮点机制。SPU也可以配置为支持32位单精度格式。它可以进一步配置为支持16位半精度格式。该机制支持比定点格式更大的动态范围。实数算术可以用浮点格式直接编码到硬件操作中,这有助于易于使用和减少开发时间。当处理非常大的数据集和范围不容易预测的数据集时,宽动态范围特别重要。
SPU可以在每个循环上执行一个单精度或半精度浮点操作。支持以下操作:
将浮点数提取到其组件中会为每个浮点数产生三个部分:浮点符号、浮点指数和浮点尾数,其中每个组件都是定点数。通过提取浮点数分量,用户可以执行定点运算(如平方根和除法),然后将这些分量组合到一个浮点数中。
浮点机制(FLP)支持IEEE-754标准中描述的以下舍入模式:
如果两个最近的浮点数相等地接近无限精度的结果,则返回LSB为偶数的结果。
如果两个最近的浮点数相等地接近无限精确的结果,则返回幅度较大的结果。
缩放浮点操作的舍入模式用法由FLPRND(法兰)SFPSR寄存器中的字段。注意:仅当使用适当的硬件配置时,才支持浮点指令。
CEVA-BX2支持以下复数格式:
注:该类型仅限于较短复杂类型的MAC操作的累加器。
用于处理这些格式的Vec-C约定是两元素向量,每个元素的底层数字类型(实数或虚数)是有符号整数。算术运算支持用于其他定点算术的机制,操作包括饱和度、舍入、左移位(用于Q15或Q31定点约定)和右移位(用于缩放)。
复杂类型由专用指令支持,专用指令期望数字在寄存器中以特定的方式组织,如和中所示。实施例5-3实施例5-4 16位复数组织在一个寄存器中,其中实数部分占用低16位,虚数部分占用高16位,如中所示。实施例5-3
实施例5-3.寄存器中16位复数的组织
在汇编语法中,使用类型.s2将复杂的16位数字指定为两元素16位向量。操作数的复数解释由相应的指令完成。例如,中的abs(绝对值)是正常的SIMD操作。然而,复杂的乘法运算解释实部和虚部,如和中所示。实施例5-3实施例5-3实施例5-4
32位复数组织在寄存器对中,其中实数部分在第一个指定的操作数中(对中的最左侧),虚数部分在对中的第二个操作数中,如中所示。实施例5-4
实施例5-4.寄存器对中32位复数的组织
在汇编语法中,使用.i1类型表示每个元素,将复杂的32位数字指定为两个元素的32位向量。操作数的复数解释由相应的指令完成。例如,中的abs是正常的SIMD操作。然而,复杂的乘法运算解释前面指定的实部和虚部。实施例5-4
64位复数作为较短复杂类型的乘法累加操作的累加器对的使用有限。因此,它不是由特定的语法标识的。每个累加器都被指定为两个寄存器(rA0.ll、rA1.lh)的常规长长类型操作数
SPU使用四个16x16位乘法器,使其能够在单个周期内执行16位复数乘法,包括后置移位、舍入、累加和饱和的辅助功能。可以(根据相关性)将操作的目标选择为以下之一:
以下算术运算支持16位复数。适用时,饱和、乘法后移位和舍入适用。每个指令在一个周期内执行:
SPU具有两个32x32位乘法器,使其能够在两条指令中执行32位复数乘法,包括后置移位、舍入、累加和饱和的辅助功能。可以(根据相关性)将操作的目标选择为以下之一:
32位复数支持以下算术运算。适用时,饱和(到32位)、乘法后移位和舍入适用。除非另有规定,否则每个操作都由一条指令执行:
一些SPU指令更新隐式算术状态,并将其保存在SASR标志中,如以下部分所述:
进位、溢出和限制标志有两种变体:更新标志和粘性标志。每当执行影响更新标志的SPU指令时,更新标志都可以更改其状态。检测到第一个条件后,粘性标志保持设置,并且只能通过软件的显式写入来清除。列出了这些标志。表5-4
表5-4. SPU进位、溢出和限制标记
事件类型 |
正在更新标志 |
粘滞的标志 |
Carry |
SCARRY |
SCF |
Overflow |
SOVFL |
SOF |
Limit |
SLIMIT |
SLF |
例如,在两条加法指令的序列中,一条产生进位条件,另一条不产生进位情况,第一条指令将同时设置SCARRY和SCF标志,第二条指令将在不更改SCF标志的情况下清除SCARRY标志。
当可以更新标志的两条指令同时执行时,例如在SPU0和SPU1中,或在SIMD操作中,如果条件发生在任何指令或SIMD操作上,则将设置相应的标志。
如果预测了可能影响标志的SPU指令,则标志不会受到影响。如果SIMD谓词仅基于一个SIMD操作,则该标志将根据另一SIMD操作进行更新。如果两个SIMD谓词都处于活动状态,算术标志将不受此指令的影响;然而,如果相关,它可能会受到并行执行的其他SPU指令的影响。
进位标志可以断言为加法、减法或移位操作:
进位标志不受使用饱和开关的指令的影响。
溢出标志可以由涉及各种类型的加法、减法、乘法和移位操作的指令设置:
对于使用加法或减法执行的乘法(如mac、mad等),不会计算溢出。溢出标志不受使用自动饱和开关的指令的影响。
Limit标志可以由涉及各种类型的加法、减法、乘法和移位操作的指令断言。
限制标志检测用饱和值替换结果,并在以下自动饱和情况之一发生时设置:
有关饱和度的更多详细信息,请参见第5.3.5节,结果饱和度和第5.3.6节,产品饱和度。不使用饱和开关的指令不会更新限制标志。唯一的例外是bmac和bmac_first指令,它们在没有显式饱和开关的情况下固有地饱和结果。
当除数为0时,在执行分步指令时设置“被0除”标志。该标志不是粘性标志,通常作为中断连接到ICU。