ARMアーキテクチャのビルド中にWidowsでxxh3.h
を使用する際に問題が発生しました。
問題は、 __emulu
がx64 / x86のみのWindows内部マクロ( MS Docs )であるということです。
/* U64 XXH_mult32to64(U32 a, U64 b) { return (U64)a * (U64)b; } */
#ifdef _MSC_VER
# include <intrin.h>
/* MSVC doesn't do a good job with the mull detection. */
# define XXH_mult32to64 __emulu
#else
# define XXH_mult32to64(x, y) ((U64)((x) & 0xFFFFFFFF) * (U64)((y) & 0xFFFFFFFF))
#endif
定義されている場合は、使用する前に_MSC_VER
のみをチェックします。 これでアーキテクチャもチェックできれば非常に役立ちます。 ARMの場合は含めないか、x64 / x86プロセッサでのみ使用してください。 ありがとう。
良い点、通知@carstenskyboxlabsに感謝し
このコードパスはx86
/ x64
に対してのみ有効であるように強制する必要があります。これは、 __emulu
命令が定義されているターゲットだからです。
補足:ARM用のVisual Studioコンパイルをテストし、そのようなテストをAppveyorCIに自動化する方法を見つけることができれば素晴らしいと
返信ありがとうございます。
AppveyorCIを使用したことがないかどうかはわかりませんが、VS / MSBuildがUWPARMビルドをサポートしていることは知っています。
CMakeとVisualStudio 2019を使用してこれらの手順を実行すると、次のようになります。
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
このエラーが発生します:
xxhash.obj : error LNK2019: unresolved external symbol __emulu referenced in function XXH3_mul128_fold64 [C:\Users\steve\Do
cuments\xxHash\cmake_unofficial\build\xxhash.vcxproj]
C:\Users\steve\Documents\xxHash\cmake_unofficial\build\Debug\xxhash.dll : fatal error LNK1120: 1 unresolved externals [C:\U
sers\steve\Documents\xxHash\cmake_unofficial\build\xxhash.vcxproj]
appveyor.ymlの経験はあまりありませんが、既存のパターンに従うと、ARM用に生成して実行できるようになると思います。
- if "%PLATFORM%"=="visual_arm" (
cd cmake_unofficial &&
cmake . -DCMAKE_BUILD_TYPE=Release -A ARM &&
cmake --build . --config Release
)
ヒントをありがとう@ v-strob! 試す価値があります!
これはおそらくうまくいくはずです。 ARMコンパイルを修正し、 x64のパフォーマンスをます
#if defined(_MSC_VER) && defined(_M_IX86)
# include <intrin.h>
# define XXH_mult32to64 __emulu
#else
# define XXH_mult32to64(x, y) ((U64)((x) & 0xFFFFFFFF) * (U64)((y) & 0xFFFFFFFF))
#endif
dev
ブランチで修正済み
最も参考になるコメント
CMakeとVisualStudio 2019を使用してこれらの手順を実行すると、次のようになります。
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
このエラーが発生します:
appveyor.ymlの経験はあまりありませんが、既存のパターンに従うと、ARM用に生成して実行できるようになると思います。