是否所有x86-64实现都支持CMOVcc指令?

问题描述 投票:1回答:2

在回答问题Assembly code to return smallest integer in array instead randomly returns either last or second to last number时,我提出了使用cmovcc指令的替代方法。我在那说:

cmov指令似乎受所有AMD64 CPU支持。

但是,当时我还没有确切的消息来源来支持这一说法。因此,我想发布此问题以进行询问。

assembly x86-64 instruction-set
2个回答
1
投票

cmovcc随Intel PPro一起引入,早于x86-64,并且在所有更高版本的Intel CPU上均受支持。 AMD的首批AMD64 CPU(K8)以及之前的K7也支持此功能,但K6不支持。当然,这些供应商和Via等其他所有更高版本的CPU。

实际上,所有x86-64 CPU都支持它,编译器肯定认为它可用于64位代码生成。

这很重要,因为像gcc do n't这样的编译器会假设x86-64的早期版本,除非您使用特殊选项。例如lock cmpxchg16b(早期AMD缺少)或lahf在长模式下(早期64位Intel P4缺少)。 GCC does假定为cmov而没有任何-march=选项的事实表明,假定了通用支持。

(GCC通常使用Pentium Pro配置为32位模式代码生成,但是也使用cmov但不使用SSE1。例如return a ? b:c;编译为gcc as old as 4.6 on Godbolt的cmov。这肯定是not基准GCC通常配置为在32位模式下以“ i686”为目标,但实际上是在64位模式下以x86-64为基准,因为它仍然具有足够的功能,因此无法在32位模式下运行,并且会在P5 Pentium和更早版本的P5上出现故障。糟糕。)


不过,您不知道在哪里可以找到有关该基准的官方确认。英特尔手册(https://www.felixcloutier.com/x86/cmovcc)确实是这样:

[CMOVcc指令在P6系列处理器中引入;,但是,这些指令可能不是所有IA-32处理器都支持]。软件可以通过使用CPUID指令检查处理器的功能信息来确定是否支持CMOVcc指令(请参阅本章中的“ CPUID-CPU标识”)。

(相关的CPUID功能位为cpuid[EAX=1].EDX.bit15sandpile或EAX = 8000_0000h),如果存在x87 FPU,也表示支持其他P6功能,如fcomifcmovcc,即位[C0 ]设置相同的EDX输出。)

I 认为

IA-32的措辞意味着没有IA-32e处理器(Intel在x86-64上的名称)缺少它,只有一些IA-32处理器。但这不是一个很明确的陈述,基于我知道实际上是对的事实,我可能会过度解释。

关于此问题的另一个答案指出了SSE2。实际上,所有支持SSE2的CPU也都支持0,但是cmov不是“ SSE2的一部分”。它们具有单独的CPUID功能位。 (而且两者都是x86-64的基线,因此64位代码不需要检查功能位。)

没有什么可以阻止某人使用SSE2来构建CPU,但不能阻止cmov ...,除了没有人会购买它是因为它无法运行正常的二进制文件之外。许多现代编译器甚至在32位模式下都使用CMOV,即使默认情况下

使用SSE1也是如此。 (这似乎有点愚蠢;仍在使用的PPro / PII CPU的数量可能不会比P5 Pentium和兼容的CPU高很多。但是,半现代的AMD Geode具有不带SSE1的CMOV。cmov

0
投票

在stackoverflow上,我确实找到了https://bugzilla.redhat.com/show_bug.cgi?id=538268#c9的答案,该答案在两个地方解决了我的问题。就是这样:

© www.soinside.com 2019 - 2024. All rights reserved.