【问题标题】:What is practical application of x86 RCL/RCR instructions?x86 RCL/RCR指令的实际应用是什么?
【发布时间】: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 / porpunpcklqdqgmplib.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


【解决方案1】:

在移位操作中,这些指令与加法中的加法 (adc) 或减法进位 (sbb) 指令的作用相同:

当处理大于CPU寄存器最大大小的数字时,它用作第二条指令,因此必须使用多个操作来处​​理该数字。

示例:在 386 CPU 上,您可以使用一条指令执行 32 位操作。但是,您可能希望处理 320 位整数。

假设我们有一个 4 位 CPU,我们想要对一个 16 位整数执行“算术右移”(sar) 操作:

Integer: ABCDEFGHIJKLMNOP  (A-P = some bits that may be 1 or 0)

Operation on a 16 bit CPU:

    ABCDEFGHIJKLMNOP (SAR 1) -> AABCDEFGHIJKLMNO, CF = P

Operation on a 4 bit CPU:

    ABCD (SAR 1) -> AABC, CF = D
    EFGH, CF = D (RCR 1) -> DEFG, CF = H
    IJKL, CF = H (RCR 1) -> HIJK, CF = L
    MNOP, CF = L (RCR 1) -> LMNO, CF = P

So the final result on the 4-bit CPU is AABCDEFGHIJKLMNO, CF = P

当然,同样的例子也适用于 64 位 CPU 上的 256 位数字...

另请注意:

使用add/adcsub/sbcshl/rcl,我们从低位开始,然后从高位继续。但是,使用shr/rcrsar/rcr 则相反。

【讨论】:

  • 另外值得一提的是,adc x,xrcl x, 1 在读取/设置 CF 方面完全相同,但速度更快。 (rcl rax,1 是 Skylake 上的 3 uop 指令,但 adc rax,rax 是单 uop agner.org/optimize。Rotate-by-1 设置了额外的标志,但不是 all 标志,因此它解码为标志合并uop。变量计数rcl 甚至更慢,但即使它很快,也不会有很多用例,AFAIK。)所以rcl 只有当您的数据在内存中时才有意义。不过,rcr 无法轻易模仿。
  • 趣事:在 AVR(8 位 RISC)上,rol is a pseudo-instruction for adc same,same。 (AVR 旋转总是通过进位。)
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 2019-03-25
  • 2019-11-16
  • 2019-06-20
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多