我正在研究与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;
}
参考文献:
答案 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;
}