x64架构下如何高效将64位寄存器设置为-1?
x64架构下将寄存器设为-1的优化方案探讨
如果问题是“x64架构下如何高效将64位寄存器设置为0?”,答案很明确——没人能比得过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
它用了两条指令而非一条,看起来似乎不如单指令方案,但其中一条指令“几乎没什么成本”,说不定可行。而且它只占5字节,比前者的7字节更短。通过相关时序分析工具查看后,我没看出哪种方案有绝对优势,但显然我不是这方面的专家。
我想知道的是:如果gcc开发者收到建议改用第二种写法的bug报告,他们会回应“哇!好主意,我们马上改”,还是说“这写法确实巧妙,但实际场景里……”?
我们都知道编译器会针对特定值生成优化代码——没人会用mov rcx, 0这种低效写法。虽说-1不像0那样常用,但也不算罕见,要是有更优方案,那确实该做优化。
那第二种写法到底是不是更优的选择?
内容的提问来源于Stack Exchange,提问作者David Wohlferd
相关产品推荐
相关产品推荐

