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 は両方を生成します。