为什么按位运算比旧微处理器上的加/减操作稍快?

我今天看到了这段摘录:

在大多数较旧的微处理器上,按位运算比加法和减法运算稍快,并且通常比乘法和除法运算快得多。 在现代体系结构中,情况并非如此:按位运算通常与添加速度相同(尽管仍然比乘法更快)。

我很好奇为什么按位操作比旧微处理器上的加/减操作稍快一些。

我能想到的只会导致延迟的是,实现加/减的电路取决于几级逻辑门(并行加法器和诸如此类),而按位运算则具有更简单的电路实现。 这是什么原因?

我知道算术和按位运算都在现代处理器的一个时钟内执行,但纯粹谈到电路的传播时间,理论上现在处理器中的延迟是不是仍然存在?

最后,我有一个关于按位移位操作执行的概念C问题:

unsigned x = 1; x <<= 5; unsigned y = 0; y += 32; 

xy都应该保持值32 ,但是它需要5个单独的左移来获得x到该值(如通过管道实现的按位移位)? 为了澄清,我纯粹是在询问电路行为而不是时钟周期数。

在任何二进制位操作中,每个输出位仅取决于输入中的两个相应位。 在加法运算中,每个输出位取决于输入中的相应位和右侧的所有位(朝向较低值)。

例如,最左边的位01111111 + 00000001为1,但最左边的位01111110 + 00000001为0。

在最简单的forms中,加法器将两个低位相加并产生一个输出位和一个进位。 然后添加接下来的两个最低位,并添加进位,产生另一个输出位和另一个进位。 这重复。 因此,最高输出位是添加链的末尾。 如果你像老式处理器那样逐位进行操作,那么到达终点需要时间。

通过将几个输入位馈入更复杂的逻辑布置,有一些方法可以加速这一点。 但这当然需要更多的芯片面积和更大的功率。

今天的处理器有许多不同的单元,用于执行各种工作负载,存储,添加,乘法,浮点运算等。 鉴于今天的function,与其他任务相比,执行添加的工作量很小,因此它适合单个处理器周期。

也许从理论上讲,您可以使处理器比添加更快地执行按位操作。 (至少在纸面上,有异步操作的外来处理器,不同的单元按照自己的节奏工作。)然而,随着设计的使用,你需要一些定期的固定周期来协调处理器加载中的许多事情指令,将它们分派给执行单元,将执行单元的结果发送到寄存器,等等。 一些执行单元确实需要多个周期来完成它们的工作(例如,一些浮点单元需要大约四个周期来进行浮点加法)。 所以你可以混合使用。 但是,对于当前的刻度,使循环时间变小以使其适合按位操作而不是添加可能不经济。

添加(你通常可以免费减去)的复杂事情是,有一个讨厌的携带问题。

所以,你最终得到的是N次Full-Adders的天真解决方案,其中N是ALU的多少位宽。

这些讨厌的意味着你有很多传播延迟。 并且,由于单次进位可能会导致整个结果不准确,因此您最终必须等待相当长的时间才能获得所有进位值,然后将链中的所有其他全加器等待结算。

围绕这个特定的瓶颈有很多方法,但没有一种方法可以像完整加法器链那样简单或资源便宜。 (最快的是在硅中实现的查找表)

如果您想了解更多细节,可能需要在http://electronics.stackexchange.com上询问

要回答你的上一个问题,这取决于。 有些架构只有1的移位(例如z80),有些架构通过较大的常量和/或变量来显示移位,但是在内部实现它们是一堆“移1”(例如x86的旧实现),有一些架构在一个周期内可以移位超过1但是只有在移位量是常数的情况下,有一些架构(例如x86的现代实现)使用桶形移位器并且可以在一个周期内通过变量移位,还有更多的可能性。

桶形移位器的电路深度在它可以做的最大移位中是对数的,这不一定是寄存器的宽度 – 它有时比宽度小一个,并且可以想象它甚至更小。

一些额外的实现必须为进位执行额外的循环。 例如:16位整数需要8位处理器上的多条指令。 这也适用于转变。 但是移位总是可以将高度位移到下一个字节的低位。 添加必须在另一轮中添加较低位。

比特运算符在更短的时间内执行,因为

  • 处理器采用一条指令执行逐位运算,(假设)采用一个执行周期,另一方面,其他算术指令(特别是乘法和除法)需要更多的执行周期
  • 大多数时候,在一个寄存器中执行逐位操作,并且需要处理多于一个寄存器的其他算术指令

这就是为什么移位比其他算术运算更快的原因

我从一个介绍到assembly课,我发现了这一点。 但是,移位只是处理器可以执行的最快指令。 添加和减去需要执行一些指令。 我认为现代处理器的优化程度更高。

据推测,有人可以更准确,更彻底地回答这个问题。