長年のMSVCユーザーで、gccは初めてです(我慢してください)。
Windows7でrubenvbバージョンのc++(件名のバージョンを参照、はい、64ビット用にビルドしています)を使用していますが、_BitScanForward64の使用に問題があります。いくつかのサンプルコードは次のようになります。
int __cdecl main(int argc, char* argv[])
{
DWORD d = (DWORD)atoi(argv[1]);
DWORD ix, ix2;
ix2 = _BitScanForward64(&ix, d);
printf("bsf %u %u\n", ix, ix2);
}
私はコンパイルしています:
"C:\ Program Files \ gcc2 \ mingw64 \ bin \c++。exe"-oiTot.exe -mno-ms-bitfields -march = native -momit-leaf-frame-pointer -mwin32 -Os -fomit-frame-pointer -m64 -msse4 -mpopcnt -D WINDOWS main.cpp
パラメータ8を使用してiTot.exeを実行すると、_BitScanForward64によってixが3に設定されると予想しました。これがMSVCの機能です。ただし、ixは0で、ix2は1です。
また、アセンブラを見ると、次のようになります。
bsfq QWORD PTR 44[rsp],rax # MEM[(volatile LONG64 *)&ix], Mask
このような状況で、gccがメモリの書き込みと読み取りを強制するのはなぜですか?
だから、いくつかの質問:
- _BitScanForward64はどういうわけかgccの下で異なって呼び出されることになっていますか?私がそれを間違っていると言っているのであれば、それを知っておくとよいでしょう(ただし、MSVCとの非互換性は苦痛です)。
- _BitScanForward64組み込みがメモリ書き込みを強制するのはなぜですか?
-Sからのアセンブラー出力を見つめていると、生成されているコードに何の問題も見られませんでした。ただし、objdump.exe -d -Mintelを使用すると、上記のasmコードを使用するのではなく(動作するように見えます)、実際には逆の結果が得られたことがわかります。
bsf rax、QWORD PTR [rsp + 0x2c]
WTF?-Sが私に嘘をついているのはなぜですか?
私が言ったように、私はgccを初めて使用するので、何か馬鹿げたことをしているだけなら、私に優しくしてください。ありがとう。