FXMVECTOR の定義が 32 ビットと 64 ビットで異なるのはなぜですか? SIMD の栄光を利用するために、32 ビットで参照によって XMVECTOR を渡してはいけないのはなぜですか?
前もって感謝します!
FXMVECTOR の定義が 32 ビットと 64 ビットで異なるのはなぜですか? SIMD の栄光を利用するために、32 ビットで参照によって XMVECTOR を渡してはいけないのはなぜですか?
前もって感謝します!
さまざまな呼び出し規約のマクロと型の詳細については、 Microsoft Docsで詳しく説明されています。
要するに、ライブラリは、多くのプラットフォームで合理的に「最適な」呼び出し規約をサポートしようとしています。
__fastcall
最初の 3 つの SIMD 値がレジスタに渡される32 ビット。スタックは 4 バイトのアラインメントのみを保証するため、残りは参照渡しする必要があります。
32 ビット__vectorcall
(VS 2013 以降が必要) 最初の 6 つの SIMD 値までがレジスターで渡され、HVA (つまり、SIMD 値の行列)
__fastcall
レジスタに SIMD 値を渡さない64 ビットですが、スタックは 16 バイトでアラインされています。
64 ビット__vectorcall
(VS 2013 以降が必要) 最初の 6 つの SIMD 値までがレジスターで渡され、HVA (つまり、SIMD 値の行列)
レジスタの最初の 4 つの SIMD 値を渡し、HVA をサポートする ARM/ARM64。
そのため、物事を確実にレジスターに渡すことができるようにするために、それらは「値渡し」で渡されます。コピーを最小限に抑えるには、最終的にレジスタに格納される可能性が低いものを「参照渡し」する必要があります。
もちろん、最終的に最適化されたコードでインライン化によって呼び出し規約の使用が削除されることが本当の望みですが、それを保証することはできません。