MSVC と ICC は両方とも、組み込み関数_addcarry_u64
と_addcarryx_u64
.
Intel の Intrinsic Guideとホワイト ペーパーによると、これらはそれぞれ と にマッピングする必要がadcx
ありadox
ます。ただし、生成されたアセンブリを見ると、それらがそれぞれ および にマップされadc
、adcx
にマップされる組み込み関数がないことが明らかadox
です。
MSVC と ICC で ADX を有効にする方法がわかりません。/arch:AVX2
さらに、MSVCで AVX2 を有効にするか-march=core-avx2
、Linux の ICC でAVX2 を有効にするようにコンパイラに指示しても、違いはありません。
MSVCのドキュメントに_addcarryx_u64
は ADX のテクノロジが記載_addcarry_u64
されていますが、記載されているテクノロジはありません。ただし、これらの組み込み関数に関する MSVC のドキュメントのリンクは、MSVC 自身のドキュメントと生成されたアセンブリと矛盾する Intel Intrinsic ガイドに直接移動します。
このことから、Intel の Intrinsic ガイドとホワイト ペーパーは間違っていると結論付けます。
これは、インライン アセンブリが許可されていない MSVC の意味にある程度の意味がありadc
ます_addcarry_u64
。
adcx
との大きな利点の 1 つは、adox
異なるフラグ (キャリーCF
とオーバーフローOF
) で動作することです。これにより、2 つの独立した並列キャリー チェーンが可能になります。しかし、これはadox
どのように可能でしょうか? ICC では少なくとも 1 つがインライン アセンブリを使用できますが、これは 64 ビット モードの MSVC では不可能です。
Microsoft と Intel のドキュメント (ホワイト ペーパーとオンラインの組み込みガイドの両方) は現在、一致しています。
_addcarry_u64
固有のドキュメントには、のみを生成すると書かれていadc
ます。_addcarryx_u64
組み込み関数は、またはのいずれadcx
かを生成できますadox
。ただし、MSVC 2013 および 2015 では_addcarryx_u64
、adcx
. ICC は両方を生成します。