2.3 算术逻辑单元
两个ALU执行定点数的算术和逻辑操作。ALU定点指令操作16-bit、32-bit或40-bit的定点操作数,得到16-bit、32-bit或40-bit的定点结果。ALU指令包括:寄存器的定点加减法、立即数的加减法、乘法结果的累加/减、逻辑(与、或、非、异或、按位异或、取反)操作、函数(取绝对值、最大值、最小值、圆整、除法原语)操作。
2.3.1 ALU操作
ALU的主要操作是在ALU0中进行的,并行操作则是在ALU1中进行,它执行ALU0操作的一个子集,表2-8描述了每个ALU可能的输入和输出,联合两个ALU操作,单条指令能得到4个16-bit结果、2个32-bit结果或2个40-bit结果。
表2-8 每个ALU的输入和输出
单16-bit操作 在单16-bit操作中,任意两个16-bit寄存器半字可用于ALU的输入。一个加法、减法或逻辑操作产生一个16-bit结果,保存到一个任意的目的寄存器的半字上。例如指令:
R3.H=R1.H+R2.L (NS);
它把R1.H加到R2.L上,并将结果保存到R3.H中,不带饱和选项。
双16-bit操作 在双16位操作中,任何两个32-bit寄存器都可作为ALU的输入,作为16-bit操作数对。加法、减法或者逻辑操作产生两个16-bit结果,保存到一个任意的32-bit目的寄存器中。例如指令:
R3=R1 + | - R2 (S);
它把R2.H加到R1.H上,并把饱和处理后的结果保存到R3.H里。这条指令也从R1.L中减去了R2.L,并将饱和处理后的结果保存到R3.L里,如图2-6所示。
图2-6 双16-bit ALU操作
4个16-bit操作 在4个16-bit操作中,任意2个32-bit寄存器都可用于ALU0和ALU1的输入,作为16-bit操作数对。一个少量的加法或减法操作得到4个16-bit结果,保存到两个任意的32-bit目的寄存器。ALU0和ALU1都用于这种操作,因为只有两条32-bit数据通道从Rn到算术单元,所以提供给ALU1的是与ALU0同样的两对16-bit输入。指令构造同双16-bit操作是一样的,对于两个ALU,输入操作数必须是相同的。例如指令:
R3=R0 +|+ R1,R2=R0-|- R1 (S);
它将执行4个操作:
(1)R1.H加上R0.H,保存结果到R3.H里,带饱和操作。
(2)R1.L加上R0.L,保存结果到R3.L里,带饱和操作。
(3)R0.H减去R1.H,保存结果到R2.H里,带饱和操作。
(4)R0.L减去R1.L,保存结果到R2.L里,带饱和操作。
明确地说,上述指令等价于下面4个指令:
R3.H=R0.H + R1.H (S); R3.L=R0.L + R1.L (S); R2.H=R0.H - R1.H (S); R2.L=R0.L - R1.L (S);
单32-bit操作 在单32-bit操作中,任意两个32-bit寄存器都可用做输入运算单元,看做32-bit操作数。一个加法、减法或逻辑操作产生一个32-bit结果,存入到一个任意32-bit目的寄存器。除了32-bit输入操作数来自Rn,操作数还可能源于和存储到Pn、SP、FP。注意,指令中不能混合使用指针寄存器与数据寄存器。例如指令:
R3=R1 + R2 (NS);
它将R2的32-bit值加上R1的32-bit值,结果不带饱和处理,存储在R3里。
R3=R1 + R2 (S);
它将R1的32-bit值加上R2的32-bit值,将饱和处理后的结果存储在R3里。
双32-bit操作 在双32-bit操作中,任何两个32-bit寄存器都可被用做ALU0和ALU1的输入,看做一对32-bit操作数。一个加法或减法产生两个32-bit结果,存入两个32-bit目的寄存器。ALU0和ALU1都用于本操作,提供给它们的是同样的两个32-bit输入寄存器。例如指令:
R3=R1 + R2,R4 = R1- R2 (NS);
它将R2的32-bit值加上R1的32-bit值,结果不带饱和处理,存储在R3里。该指令还从R1中减去R2,结果不带饱和处理,存储在R4里。
这种指令的一种专门形式是使用40-bit的An作为操作数,得到关于A0和A1寄存器的和与差。例如指令:
R3=A0 + A1,R4=A0- A1 (S);
它将An进行加减操作,带饱和处理,并将两个32-bit的和与差转输到结果寄存器。
ALU指令汇总 表2-9列出了ALU的指令,表中符号含义如下:
表2-9 ALU指令汇总
续表
(1)Dreg_lo_hi表示任何Rn的16-bit寄存器半字。
(2)imm7表示有符号的7-bit宽的立即数。
(3)DIVS表示除法符号原语。
(4)DIVQ表示除法商原语。
(5)MAX表示源寄存器里的最大值。
(6)MIN表示源寄存器的最小值。
(7)ABS表示一个32-bit寄存器的高或低半字的绝对值。
(8)SIGNBITS表示一个数里的符号位的个数减1。
(9)d指示AQ包含被除数最高有效位与除数最高有效位的异或。
2.3.2 ALU数据流详细情况
如图2-7所示为算术单元和数据寄存器文件更加详细的情况,它在图1-1里出现过。ALU1是ALU0的一个子集。每个ALU执行40-bit加法,都可用于乘法器结果的累加,以及32-bit和双16-bit操作。每个ALU都有两个32-bit的输入端口,可以看做一对16-bit操作数或一个32-bit操作数。对于单个16-bit操作数,4个可能的16-bit操作数中的任意一个都可与提交给ALU输入端口的其他16-bit操作数中的任意一个一起使用。如图2-6所示,双16-bit操作数,高半字和低半字是成对的,提供了4种可能的加减组合:
图2-7 寄存器文件和ALU
(1)H + H,L + L;(2)H + H,L - L;(3)H - H,L + L;(4)H - H,L - L
双16-bit交叉选项 对于双16位操作,结果可能会交叉,“交叉结果”会改变计算结果在结果寄存器中的位置。通常,高端的计算结果放置在结果寄存器的高半字中,低端的计算结果放置在结果寄存器的低半字里。在带有交叉选项的情况下,高端结果放置在目的寄存器的低半字里,低端结果放置在目的寄存器的高半字里,如图2-8所示,在处理复数数学运算和快速傅里叶变换(FFT)的部分操作时,这是非常有用的。交叉选项只适用于ALU0。
图2-8 双16-bit ALU操作的交叉选项
错误!
ALU状态信号 每个ALU可产生6个状态信号:零状态(AZ)、负数标志(AN)、进位标志(ACn)、黏性溢出标志(AVnS)、当前溢出标志(AVn)和商标志(AQ),所有算术状态信号在周期结束时锁存到算术状态寄存器(ASTAT)里。关于ALU指令对状态标志的影响,参见表2-9。输入可以来自于Rn、P寄存器或算术结果寄存器,这取决于指令。32-bit操作数的算术支持ALU多精度操作。
2.3.3 ALU除法支持与视频操作
ALU支持除法,有两个专用的除法原语DIVS和DIVQ。除法可以是有符号的或无符号的,但是被除数和除数必须是同一类型。
处理器具有特殊的SIMD视频ALU操作功能,4个8-bit视频ALU使处理器能够高效率地处理视频信息。每个视频ALU指令可能需要1~4对8-bit的输入,输出1~4对8-bit的结果,输入是用Rn按2个32-bit字的形式提交给视频ALU的。可能的操作包括:4个8-bit数的加法或减法、4个8-bit数的平均、4个8-bit数的打包和解包、4个8-bit数的减-绝对值-累加、字节对齐。