英特尔软件开发手册就neg
指令说明了这一点:
我以为可以将AF和CF设置为好像用neg %eax
替换了,
not %eax # bitwise negation
add $1, %eax
但是事实并非如此,在实际CPU上取反0x6ffffef5会设置AF和CF。
最佳答案
neg
将的所有标志设置为与从0开始的sub
相同。
此指令序列将所有标志(包括AF和CF)设置为neg %eax
相同:
xor %ecx, %ecx
sub %eax, %ecx # ecx = 0 - eax
英特尔的文档实际上确实指定了此名称,但未在
neg
本身的指令集引用(第2卷)条目的伪代码“操作”部分或“受标志影响”部分中指定。the Description section for
neg
的文本包含此块:在Volume 1中:
a comment on an earlier duplicate of this question指出了该文档的存在,但措辞并不直接。
我不知道第1卷的整个章节都对说明进行了说明。事实证明,第2卷insn set引用中并没有提到Intel关于单个指令的所有内容。
有证据表明
neg
在内部解码为与Intel CPU上的sub
指令相同的uop。 (例如neg [mem]
可以与ALU op微融合负载,以及微融合存储地址和存储数据uops。inc [mem]
只能微融合存储,因此总共有3个融合域uops)。