gpt4 book ai didi

c++ - 正确指定旋转约束?

转载 作者:太空狗 更新时间:2023-10-29 21:17:52 25 4
gpt4 key购买 nike

我正在研究关于 Constant time rotate that does not violate the standards 的潜在加速.

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

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

处理器期望 countCL 使用寄存器时。处理器通过屏蔽除 count 的低 5 位以外的所有位来执行旋转。

下面,valuexcounty

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;
}

引用资料:

最佳答案

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

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

关于c++ - 正确指定旋转约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com