目录
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标志
5.3.5 结果饱和度
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位)类型变量不支持饱和。
5.3.4 乘法饱和度
当被乘数等于由类型(短和整数)表示的最小有符号值,并且作为操作的一部分执行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节,限制标志)。
5.3.5 乘法后移位
涉及乘法的指令(如mpy、mac等)可以将乘法结果向左移位1位,或向右移位多达32位。移位发生在后续操作之前,例如舍入、饱和和累加。执行多个乘法的指令(如mad、mpycx、mac3等)对每个乘法结果执行移位。
乘法后移位的方向和量由左右贡献因子的总和确定,并受编译选项和SAMR寄存器中sv字段的值的影响:
- 左移位贡献:由{psl1}开关激活。如果激活,则将左移位贡献设置为1。如果未激活,则将左移位贡献设置为0。
- 右移位贡献:由SAMR中sv字段中指定的量隐式激活,该量保存从0到32的无符号值,该值指定右移位量。
通过指定{ns}或{rndns}编译开关,可以禁用右移贡献(设置为0)。
当{psl1}用非零右移贡献激活时,总移位贡献是右移贡献减去1。这意味着,只有当右移位被禁用或等于0时,才能发生左移位。
5.3.6 标量浮点支持
根据IEEE-754标准,SPU支持可选的浮点机制。SPU也可以配置为支持32位单精度格式。它可以进一步配置为支持16位半精度格式。该机制支持比定点格式更大的动态范围。实数算术可以用浮点格式直接编码到硬件操作中,这有助于易于使用和减少开发时间。当处理非常大的数据集和范围不容易预测的数据集时,宽动态范围特别重要。
SPU可以在每个循环上执行一个单精度或半精度浮点操作。支持以下操作:
- 浮点加法(fpadd,hpfpadd)
- 浮点减法(fpsub,hpfpsub)
- 浮点乘法(fpmpy,hpfpmpy)
- 浮点比较(fpcmp,hpfpcmp)
- 两个浮点数的最小值和最大值(fpmin,fpmax,hpfpmin,hpfpmax)
- 将浮点数转换为各种整数类型(fp2int、fp2long、fp2ulong等,以及匹配的半精度转换)
- 将各种类型的整数转换为浮点数(int2fp,long2fp,等等,以及将转换匹配到半精度)
- 从单精度转换为半精度浮点数,反之亦然(fp2hpfp,hpfp2fp)
- 将浮点数提取到其分量(fpextract、hpfpextract)
- 将整数分量组合为浮点数(fpcombine,hpfp联合收割机)
- 浮点乘法和正或负累加(fpmac、fpmsu、hpfpmac和hpfpmsu)
- 非规格化浮点数的整数分量的规格化(fpcombine{fpnormal},hpfpcombine{hpfpnormal})
- 整数分量的舍入和打包为浮点数(fpcombine{fpround},hpfpcombine{hpfproundneneneep)
将浮点数提取到其组件中会为每个浮点数产生三个部分:浮点符号、浮点指数和浮点尾数,其中每个组件都是定点数。通过提取浮点数分量,用户可以执行定点运算(如平方根和除法),然后将这些分量组合到一个浮点数中。
浮点机制(FLP)支持IEEE-754标准中描述的以下舍入模式:
- 向偶数舍入:返回最接近无限精度结果的浮点数。
如果两个最近的浮点数相等地接近无限精度的结果,则返回LSB为偶数的结果。
- 舍入远离:返回最接近无限精确结果的浮点数。
如果两个最近的浮点数相等地接近无限精确的结果,则返回幅度较大的结果。
- 舍入到零:返回最接近无限精确结果的浮点数,其大小不大于该结果。
- 向正舍入:返回最接近无限精度结果的浮点数,并且不小于无限精度结果。
- 舍入为负:返回最接近无限精度结果的浮点数,并且不大于无限精度结果。
缩放浮点操作的舍入模式用法由FLPRND(法兰)SFPSR寄存器中的字段。注意:仅当使用适当的硬件配置时,才支持浮点指令。
5.3.7 复数支持
CEVA-BX2支持以下复数格式:
- 16位复数(16位实数+16位虚数)
- 32位复数(32位实数+32位虚数)
- 64位复数(64位实数+64位虚数)
注:该类型仅限于较短复杂类型的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)的常规长长类型操作数
5.3.7.1 16位复杂算法支持
SPU使用四个16x16位乘法器,使其能够在单个周期内执行16位复数乘法,包括后置移位、舍入、累加和饱和的辅助功能。可以(根据相关性)将操作的目标选择为以下之一:
- 四舍五入和饱和后缩回到16位复数
- 32位复数(通常在乘法之后)
- 64位复数(作为乘法累加操作后的累加器对)
以下算术运算支持16位复数。适用时,饱和、乘法后移位和舍入适用。每个指令在一个周期内执行:
- 绝对值
- 绝对平方值,到16位、32位和64位复数
- 加法、减法(正则和共轭)
- 共轭的
- 乘法(常规和共轭),到16位和32位复杂目标
- 将累加器(常规累加器和共轭累加器)乘以32位和64位复数累加器
- 将复数与实数、16位和32位复数目标相乘
- 将复数与实数相乘累加到32位复数目标
- 向左和向右移动
- 计算指数
5.3.7.2 32位复杂算法支持
SPU具有两个32x32位乘法器,使其能够在两条指令中执行32位复数乘法,包括后置移位、舍入、累加和饱和的辅助功能。可以(根据相关性)将操作的目标选择为以下之一:
- 四舍五入和饱和后缩回到32位复数
- 64位复数,作为乘法累加操作后的累加器对
32位复数支持以下算术运算。适用时,饱和(到32位)、乘法后移位和舍入适用。除非另有规定,否则每个操作都由一条指令执行:
- 绝对值
- 绝对平方值(在两个指令中)
- 加法、减法(正则和共轭)
- 共轭的
- 乘法(四条指令中的正则和带共轭)到32位和64位目标
- 将累加器(正则和带共轭,在四条指令中)乘以32位和64位复合累加器
- 将复数与实数相乘(在两条指令中),到32位和64位复数目标
- 将复数与实数乘法累加(在两条指令中)到64位复数目标
- 向左和向右移动(按两个指令)
- 计算指数(在两个指令中)
5.4 SPU算术标志
一些SPU指令更新隐式算术状态,并将其保存在SASR标志中,如以下部分所述:
- 5.4.1 进位标志
- 5.4.2 溢出标志
- 5.4.3 限制标志
- 5.4.4 除零标志
进位、溢出和限制标志有两种变体:更新标志和粘性标志。每当执行影响更新标志的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指令的影响。
5.4.1 进位标志
进位标志可以断言为加法、减法或移位操作:
- 在加法运算中,如果两个数字的运算导致加法的最高有效(最左边)位的进位,则设置进位标志。
- 减法运算被视为具有负数的加法运算,进位标志的计算方法与加法运算相同。
- 在移位指令中,进位标志反映右移位或左移位中移出的最后一个位。
进位标志不受使用饱和开关的指令的影响。
5.4.2 溢出标志
溢出标志可以由涉及各种类型的加法、减法、乘法和移位操作的指令设置:
- 此外,减法和求反运算,如果结果不能由目标表示,则会设置溢出标志,无论是由于操作还是由于将结果强制转换为输出类型。
- 在移位操作中,如果由于将结果强制转换为输出类型或将非零值移到源操作数的界限之外而导致结果不能由目标表示,则设置溢出标志。
- 在乘法运算中,如果由于操作或由于将结果强制转换为输出类型而导致结果不能由目标表示,则设置溢出标志。
对于使用加法或减法执行的乘法(如mac、mad等),不会计算溢出。溢出标志不受使用自动饱和开关的指令的影响。
5.4.3 限制标志
Limit标志可以由涉及各种类型的加法、减法、乘法和移位操作的指令断言。
限制标志检测用饱和值替换结果,并在以下自动饱和情况之一发生时设置:
- 结果饱和:由于饱和,结果数被替换为最大或最小可能数。
- 乘积饱和:特定于乘法指令。
有关饱和度的更多详细信息,请参见第5.3.5节,结果饱和度和第5.3.6节,产品饱和度。不使用饱和开关的指令不会更新限制标志。唯一的例外是bmac和bmac_first指令,它们在没有显式饱和开关的情况下固有地饱和结果。
5.4.4 除以0标志
当除数为0时,在执行分步指令时设置“被0除”标志。该标志不是粘性标志,通常作为中断连接到ICU。