【发布时间】:2019-08-27 19:53:15
【问题描述】:
我对实际应用感兴趣,即使按照现代标准来说它们已经过时了。
有类似的问题,关于 ROL 和 ROR here,但它并没有真正回答关于 RCL/RCR 的问题。
我可以想出一些 RCL 应用程序,RCR 操作数为 1(即对于某些 LFSR),但我想不出任何 非 1 操作数的合理应用程序。
那么有谁能启发我吗?
附:示例代码非常受欢迎。
更新 1:正如下面 cmets 中提到的 Peter Cordes,一个(非常明显的)应用程序是 shrd/shld。 (IIRC rcl/rcr 指令已经在 8080 中)
也许上面的“非 1”不清楚,但请注意,我最感兴趣的是使用,其中操作数是 != 1(RC(L|R) REG, c 其中 c 是 > 1 或 == cl)。
【问题讨论】:
-
在
shrd/shld存在之前,一次一个地在寄存器之间移动位是一种用例。或者在两个 16 位寄存器之间进行 32 位循环。 -
您将 x86-64 作为触发此评论的标签。 rcl/rcr 来自 8 位时代,由于向后兼容的要求,它仍然存在于 x86 中。我觉得这个问题很有趣,明天会尝试提出一些建议。我用 z80 做了很多工作(有类似的说明)。
-
@MartinRosenau:如果您只移动 1 位,那么是的,这值得考虑。否则 SSE2 或更好的 AVX2 洗牌 + 班次显然是更好的选择。例如GMP 的 SSE2 版本的
mpn_lshift使用psllq/psrlq/por和punpcklqdq。 gmplib.org/repo/gmp/file/tip/mpn/x86_64/fastsse/lshift.asm,根据对齐情况有各种情况。 (当然,如果我们不是在谈论 x86-64,那么 SSE2 可能不可用。并且变量计数shld在 Intel 上并不是超级快;GMP 似乎没有使用它。) -
是的,rcl/rcr 通过隐式 1 和 CL existed in 8086,大概是为了与其他班次的编码保持一致。然后 286 添加了所有班次的 imm8 计数版本,包括这些。然后 386 由 imm8 或 CL 添加
shld/shrd。 -
我不知道计数不是 1 的 RCL/RCL 的任何简单用例。抱歉,我错过了您询问计数的问题!= 1 使用,这是一个非常好的问题:P .这可能只是为了机器编码的一致性,因此它们不是解码中的特例。
标签: assembly x86 bit-manipulation x86-64 bit-shift