在 x86(以及大多数具有此指令的体系结构)上,额外的位是进位标志,很多东西都可以设置该标志。向左或向右循环进位可让您将进位位移回其他寄存器。有趣的是,m68k 使用不同的标志进行扩展旋转。
我对 m68k 已经不是很熟悉了,所以我主要谈谈其他拱门。 (但是apparently that's what you want :)
此类指令通常在功能远不如 x86 或 m68k 的微控制器上可用。或者由于操作码空间有限(和解码复杂性),某些 CPU 仅具有循环进位 1 而不是常规移位指令。如果要移入零,请确保先清除标志。
8051 是这样的:只左/右旋转 1,并且带进位左/右旋转 1,不移位。请参阅 ISA 参考手册中的 rlc。如果可能,当您想通过将rlc 放在其他可以清除进位的内容之后,避免使用clr 指令。
我认为扩展循环移位通常使用进位标志,而不是像 m68k 那样使用它自己的 X 位。
无论如何,扩展精度旋转对于 CPU 来说是一种传统/预期,但在更有限的 CPU 上有更多用途。
对于一个寄存器,rcl reg, 1与adc reg,reg的操作相同:将旧内容左移1,并将低位设置为CF。旋转或 adc 移出的位成为 CF 的新值。因此,如果 RCL 可与内存操作数一起使用,或者(对于奇怪的情况)计数大于 1,则 RCL 只是指令集的非冗余部分。(不过,向右旋转的版本不是冗余的。)
IDK 为什么你曾经使用过 count > 1。在现代 x86 上,如果 count=1,rotate-through-carry 相当快,但对于可变 count 或固定 count>1 肯定很慢。 IDK 鸡/蛋问题的走向:CPU 设计人员没有让它快,因为没有人使用它,或者人们停止使用它,因为它很慢。但可能是前者,因为我不记得曾经见过提到的用于循环进位超过 1 位的用途。
对于扩展精度移位,x86 有一个双移位指令 (shld / shrd dst, src, count) 移位 dst,从 src 移入位,而不是零或符号位的副本。它不适用于 2 个内存操作数,因此扩展精度移位循环必须使用单独的指令加载和存储寄存器。这比使用 rcr dword [edi], 1 / sub edi, 4 的循环要大得多,但在现代 x86 上,代码大小很少成为问题,并且使用单独的指令进行加载/存储并不慢。)更重要的是,shrd 移动多个位一次,因此您可以循环一次数组以实现多精度移位 2 位或更多位。
扩展循环一次只能在寄存器之间移动一位,因为它使用 1 位存储空间(在标志中)。我认为在 m68k 上,如果您确实想在寄存器之间移动多个位,您可能会复制一个寄存器并使用常规移位 + OR 进行组合。 (或旋转和/或来拆分位。)
在 AMD CPU 上,shld/shrd 比 rcl/rcr-by-1 慢,但在 Intel CPU 上则相反。 (http://agner.org/optimize/)。
除了在寄存器之间移动位之外,我真的想不出任何用例。也许如果你移出一点,然后在可能设置或清除 X 位的东西上进行分支,然后将位移回,你可以使用扩展旋转对低位或高位做一些事情?但是,您通常可以更轻松地使用 AND、OR 或 XOR 与常量进行相同操作。