如何有效地将64位寄存器设置为x64上的-1?

问题描述 投票:0回答:1
如果问题是“如何在x64上有效将64位寄存器设置为零?”那很容易。 你只是无法击败

xor eax, eax

。  虽然说这需要零时间是不完全正确的,但也不是完全错误的。
但是-1呢?

看Godbolt,GCC和MSVC(大概对这些东西都很好)也做同样的事情:

0000000000431004 48 C7 C1 FF FF FF FF mov rcx,0FFFFFFFFFFFFFFFFh

可启发,易于阅读,保证有效。 但是它是最佳的吗? 有什么问题:
000000000043100B 31 C9                xor         ecx,ecx  
000000000043100D 48 F7 D1             not         rcx  

这是2个说明而不是1个说明,所以这不是很好。 但是其中一个“不算在内”,也许。 这是5个字节对7,所以这是一场胜利。 查看

timing
信息(这是一个非常酷的工具,单击“运行”以查看结果)也不是我的明确赢家,但我显然不是专家。
我猜想我感兴趣的标准是:如果海湾合作委员会开发人员正在看一个暗示这种变化的错误,那么响应是“嗯!酷!我们绝对应该这样做”。或“虽然这似乎是一个聪明的主意,但在现实世界中……”

我们已经知道编译器生成代码来分配特定值(没有人可以mov rcx, 0

)。 虽然-1可能不如0那么常见,但如果有更好的方法,它并不少见,不应优化。

这是一种更好的方式?

or rcx, -1

1
performance assembly x86-64
1个回答
0
投票
4

字节。也许这比一个

mov
或一对更好? xor不会更改任何标志。 not
确实会更改标志,但也会更改标志。
我不能说哪一个会更好,但是
mov
似乎是字节中最短的。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.