MSVC 和 ICC 都支持内在函数_addcarry_u64
和_addcarryx_u64
.
根据英特尔的内在指南和白皮书,这些应该分别映射到adcx
和adox
。但是,通过查看生成的程序集,很明显它们分别映射到adc
和adcx
,并且没有内在的映射到adox
.
此外,告诉编译器
我不确定如何使用 MSVC 和 ICC 启用 ADX。/arch:AVX2
在MSVC中启用 AVX2或-march=core-avx2
在 Linux 上使用 ICC 没有区别。
MSVC的文档列出_addcarryx_u64
了 ADX 的技术,而_addcarry_u64
没有列出的技术。但是,MSVC 文档中这些内在函数的链接直接指向 Intel Intrinsic 指南,该指南与 MSVC 自己的文档和生成的程序集相矛盾。
由此我得出结论,英特尔的内在指南和白皮书是错误的。
这对于 MSVC 来说是有意义的,因为它不允许内联汇编,它应该提供一种使用adc
它的方法_addcarry_u64
。
adcx
and的一大优点adox
是它们在不同的标志(进位CF
和溢出OF
)上运行,这允许两个独立的并行进位链。但是,既然没有内在的东西,adox
这怎么可能呢?使用 ICC 至少可以使用内联汇编,但对于 64 位模式的 MSVC,这是不可能的。
微软和英特尔的文档(白皮书和在线内部指南)现在都同意了。
_addcarry_u64
内在文档说只adc
生产. _addcarryx_u64
内在函数可以产生adcx
或。adox
但是,使用 MSVC 2013 和 2015,_addcarryx_u64
只能生成adcx
. ICC同时生产。