正确指定旋转约束?

时间:2015-07-16 22:42:13

标签: c++ gcc assembly x86 inline-assembly

我正在研究与Constant time rotate that does not violate the standards相关的潜在加速。

在x86 / x64上旋转具有以下内容。为简单起见,我将讨论旋转一个字节(因此我们不会立即纠结于8与16,32或64):

  • “值”可以在寄存器或内存中
  • “计数”可以在寄存器中或立即

处理器希望 count 在使用 CL 时一个登记册。处理器通过屏蔽除 count 的低5位以外的所有内容来执行旋转。

下面, value x > count y

template<> inline byte rotLeft<byte>(byte x, unsigned int y)
{
    __asm__ __volatile__("rolb %b1, %0" : "=mq" (x) : "cI" (y), "0" (x));
    return x;
}

由于 x 是读写,我想我应该使用 + 某个地方。但我不能让汇编程序接受它。

我的问题是,约束是否正确表示?

编辑 :根据Jester的反馈,该功能更改为:

template<> inline byte rotLeft<byte>(byte x, unsigned int y)
{
    __asm__ __volatile__("rolb %b1, %0" : "+mq" (x) : "cI" (y));
    return x;
}

参考文献:

1 个答案:

答案 0 :(得分:3)

您应该为操作数使用正确大小的类型,而不是尝试使用操作数修饰符强制寄存器为正确的大小。在这种情况下,如果它太大,这也会将立即操作数截断为正确的大小。同样正如David Wohlferd所说,你不希望使asm语句变得易变,因为这会阻止优化器在它未被使用时将其删除。

template<> inline byte rotLeft<byte>(byte x, unsigned int y)
{
     asm ("rolb %1, %0" : "+mq" (x) : "cI" ((byte)y));
     return x;
}