gpt4 book ai didi

assembly - 在 x86_64 中,如果条件为假,32 位 cmov 是否会清除最高位?

转载 作者:行者123 更新时间:2023-12-04 02:27:37 24 4
gpt4 key购买 nike

在 x86 上的 64 位模式下,大多数 32 位算术运算会清除目标寄存器的前 32 位。如果算术运算是“cmov”指令,并且条件为假怎么办? (我看过的引用手册好像都没有这个案例)。

最佳答案

它总是零扩展到目的地,就像所有写入 32 位寄存器的指令一样。

将 CMOV 视为总是写入其目的地:它是一个 ALU 选择操作(3 个输入:2 个整数操作数和标志,1 个输出)。

它不像 ARM 32 位模式谓词指令那样在条件为假时真正像 NOP。

(出于同样的原因,cmovcc reg, [mem] always loads the memory operand ,即使条件为假,也不会对错误地址进行故障抑制。同样,它不是移动本身是有条件的,它正在移动条件选择操作的结果。AArch64 为其等效的相同指令选择了一个更好的名称,csel。)


在一种情况下,32 位目标可能不会被零扩展:bsrbsf r32,r/m32当源为零时,目标保持不变。 (仅记录了 by AMD(如果第二个操作数包含 0,则指令设置 ZF为 1 并且不会更改目标寄存器的内容。),但也由 Intel 实现)。至少在 Intel CPU 上的实践中,这包括在像 bsf eax, ecx 这样的指令之后不修改高位。我没有测试过 AMD。

(这就是 BSF 和 BSR 对目的地具有“假”依赖性的原因:无分支地实现此行为需要真正的依赖性。只有 a false output dependency for LZCNT/TZCNT/POPCNT on Intel 在同一执行单元上运行但始终会覆盖它。)

( Wikipedia ) 声称在 bsf r32, r/m32 之后的高位在 Intel 和 AMD 之间存在某种差异。他们似乎在说英特尔(或者可能是 AMD;措辞有些含糊)在 source=0 的情况下保留高位 未定义,而不是未修改。

在我对 Sandybridge 系列和 Core 2 的测试中,它似乎始终未修改,但我无法访问 P4 Nocona/Prescott,这是第一代 IA-32e 微架构。

撰写这篇文章的维基百科编辑可能只是误解了英特尔的文档,该文档称在这种情况下整个目标寄存器是“未定义的”。 (但它是 normal for Intel to, in silicon, go beyond what they guarantee on paper ,所以他们关心的现有软件,例如 Windows,继续工作)。 IDK 如果该声明还有其他来源,那么我想 [citation-needed] 在这里真的很合适。

关于assembly - 在 x86_64 中,如果条件为假,32 位 cmov 是否会清除最高位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66416287/

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