前导0预测(Leading-Zero Anticipator,LZA)
浮点加法在完成之后会进行尾数规格化移位,而在进行尾数加法时,可以使用前导0预测(Leading-Zero Anticipator,LZA)同时计算移位,前导0预测只发生在一个正数加上一个负数的情况下,电路图如图1所示。
1. 基础算法
算法的目标是计算出加法结果序列左边连续0的数量,下文中对序列的位置的索引值是从高位开始到低位的,假设输入尾数为
A
=
a
0
a
1
⋯
a
n
−
1
A = a_0 a_1 \cdots a_{n-1}
A=a0a1⋯an−1和
B
=
b
0
b
1
⋯
b
n
−
1
B = b_0 b_1 \cdots b_{n-1}
B=b0b1⋯bn−1,首先需要对
A
A
A和
B
B
B进行有效位减法:
R
=
A
−
B
,
R
=
r
0
r
1
⋯
r
n
−
1
,
r
i
∈
{
n
,
z
,
p
}
R = A - B, \quad R = r_0 r_1 \cdots r_{n-1}, \quad r_i \in \{ n, z, p \}
R=A−B,R=r0r1⋯rn−1,ri∈{n,z,p}
其中
n
n
n、
z
z
z、
p
p
p代表负(negative)、零(zero)、正(positive),下面分情况讨论。首先考虑
3
3
3种情况:
A
>
B
A > B
A>B、
A
=
B
A = B
A=B、
A
<
B
A < B
A<B。
1.1 A > B A > B A>B的情况
这种情况下序列 R R R中的第一个不为 z z z的值一定是 p p p, R R R的序列形式为 z ( k ) p ( x ) z^{(k)} p (x) z(k)p(x),接下来也要分 3 3 3种情况来讨论:
- z ( k ) p p ( x ) z^{(k)} pp (x) z(k)pp(x)的情况 这种情况下即使 x x x为负,也无法影响序列中 k + 1 k+1 k+1位的 p p p,因此前导共有 k k k个 0 0 0;
- z ( k ) p z ( x ) z^{(k)} pz (x) z(k)pz(x)的情况 此时若 x x x为负需要向前借位,则借位之后第一个 p p p出现在 k + 2 k+2 k+2的位置,若 x x x不需要借位,则第一个 p p p仍在 k + 1 k+1 k+1位置,但是检测 R R R的码型无法确定第一个 p p p的位置,因此先假设第一个 p p p在 k + 1 k+1 k+1的位置,之后进行纠错;
- z ( k ) p n ( j ) ( z o r p ) ( x ) z^{(k)} p n^{(j)} (z \ or \ p)(x) z(k)pn(j)(z or p)(x)的情况 其中 n n n的长度为 j j j,将前面 k + j + 1 k+j+1 k+j+1位借位化简,则得到 z ⋯ z ⋯ z ⏟ k + j p ( z o r p ) ( x ) \underbrace{z \cdots z \cdots z}_{k+j} p ( z \ or \ p) (x) k+j z⋯z⋯zp(z or p)(x),那么序列中首个 p p p出现在 k + j + 1 k+j+1 k+j+1或者 k + j + 2 k+j+2 k+j+2的位置,原因与情况 2 2 2相同;
在 A > B A > B A>B时总结出的情况如下表所示:
R R R的序列码 | 首个 p p p位置 | 判断子序列 |
---|---|---|
z ( k ) p p ( x ) z^{(k)} pp (x) z(k)pp(x) | k+1 | p p pp pp |
z ( k ) p z ( x ) z^{(k)} pz (x) z(k)pz(x)( x x x不需要借位) | k+1 | p z pz pz |
z ( k ) p z ( j ) ( x ) z^{(k)} pz^{(j)} (x) z(k)pz(j)(x)( x x x需要借位) | k+2 | p z pz pz(需要纠错) |
z ( k ) p n ( j ) p ( x ) z^{(k)} p n^{(j)} p(x) z(k)pn(j)p(x) | k+j+1 | n p np np |
z ( k ) p n ( j ) z ( x ) z^{(k)} p n^{(j)}z(x) z(k)pn(j)z(x) ( x x x不需要借位) | k+j+1 | n z nz nz |
z ( k ) p n ( j ) z ( x ) z^{(k)} p n^{(j)}z(x) z(k)pn(j)z(x) ( x x x需要借位) | k+j+2 | n z nz nz(需要纠错) |
1.2 A < B A < B A<B的情况
这种情况下序列 R R R中的第一个不为 z z z的值一定是 n n n, R R R的序列形式为 z ( k ) n ( x ) z^{(k)} n (x) z(k)n(x),为了方便讨论,以下会对 R R R的相反数 R ˉ \bar{R} Rˉ进行分析,也就是对 z ( k ) p ( y ) , y = − x z^{(k)} p (y), \ y = -x z(k)p(y), y=−x进行分析:
- z ( k ) n n ( x ) z^{(k)} nn (x) z(k)nn(x)的情况 与上节分析相同, R ˉ = z ( k ) p p ( x ) \bar{R}=z^{(k)}pp(x) Rˉ=z(k)pp(x),首个 p p p出现在 k + 1 k+1 k+1的位置,由子序列 n n nn nn( k + 1 k+1 k+1位和 k + 2 k+2 k+2位)决定;
- z ( k ) n z ( x ) z^{(k)} nz (x) z(k)nz(x)的情况 对应 R ˉ \bar{R} Rˉ为 z ( k ) p z ( y ) z^{(k)} pz (y) z(k)pz(y),若子序列 ( y ) (y) (y)不需要借位,则 R ˉ \bar{R} Rˉ的第一个 p p p出现在 k + 1 k+1 k+1位,若序列 ( y ) (y) (y)需要向前借位,那么借位由 k + 1 k+1 k+1位产生, R ˉ \bar{R} Rˉ所表示的加法结果序列的第一个 p p p在 k + 2 k+2 k+2位。同理若子序列 ( x ) (x) (x)为负需要向前借位(或者为 z z z), R R R的第一个 n n n出现在 k + 1 k+1 k+1位,若子序列 ( x ) (x) (x)为正,则第一个 p p p出现在 k + 2 k+2 k+2位。这种情况下会先假设 p p p在 k + 1 k+1 k+1位之后进行纠错;
- z ( k ) n p ( j ) ( z o r n ) ( x ) z^{(k)} np^{(j)} (z \ or \ n) (x) z(k)np(j)(z or n)(x)的情况 这种情况化简之后得到 R = z ⋯ z ⋯ z ⏟ k + j n ( z o r n ) ( x ) R=\underbrace{z \cdots z \cdots z}_{k+j} n ( z \ or \ n) (x) R=k+j z⋯z⋯zn(z or n)(x),那么 R R R中的首个 n n n出现在 k + j + 1 k+j+1 k+j+1或 k + j + 2 k+j+2 k+j+2位,还是假设 n n n出现在 k + j + 1 k+j+1 k+j+1,随后进行纠错。
A < B A<B A<B的情况如下表所示:
R R R的序列码 | 首个 n n n位置 | 判断子序列 |
---|---|---|
z ( k ) n n ( x ) z^{(k)} nn (x) z(k)nn(x) | k+1 | n n nn nn |
z ( k ) n z ( x ) z^{(k)} nz (x) z(k)nz(x)( x x x不需要借位) | k+1 | n z nz nz |
z ( k ) n z ( j ) ( x ) z^{(k)} n z^{(j)} (x) z(k)nz(j)(x)( x x x需要借位) | k+2 | n z nz nz(需要纠错) |
z ( k ) n p ( j ) n ( x ) z^{(k)} n p^{(j)} n (x) z(k)np(j)n(x) | k+j+1 | n p np np |
z ( k ) n p ( j ) z ( x ) z^{(k)} n p^{(j)}z(x) z(k)np(j)z(x) ( x x x不需要借位) | k+j+1 | n z nz nz |
z ( k ) n p ( j ) z ( x ) z^{(k)} n p^{(j)} z (x) z(k)np(j)z(x) ( x x x需要借位) | k+j+1 | n z nz nz(需要纠错) |
3. A = B A = B A=B的情况
不需要编码移位。