J'ai un problème avec l'utilisation de xxh3.h
sur Widows lors de la construction d'une architecture ARM.
Le problème est que __emulu
est une macro interne x64/x86 uniquement 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
Là où il est défini, il ne vérifie qu'un _MSC_VER
avant de l'utiliser. Ce serait très utile si cela pouvait également vérifier l'architecture. Dites soit en ne l'incluant pas lors de l'ARM ou en l'utilisant uniquement sur les processeurs x64/x86. Merci.
Bon point, merci pour la notification @carstenskyboxlabs !
Nous devrions probablement imposer que ce chemin de code n'est valide que pour x86
/ x64
, puisque c'est la cible où l'instruction __emulu
est définie .
Remarque : ce serait formidable si je pouvais trouver un moyen de tester la compilation Visual Studio pour ARM et d' automatiser un tel test dans AppveyorCI . Il aurait attrapé ce problème, et d'éventuels futurs.
Merci pour la réponse.
Je ne suis pas sûr de n'avoir jamais utilisé AppveyorCI, mais je sais que VS/MSBuild prend en charge les builds UWP ARM.
Lorsque j'exécute ces étapes à l'aide de CMake et Visual Studio 2019 :
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
J'obtiens cette erreur :
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]
Je n'ai pas beaucoup d'expérience avec appveyor.yml, mais en suivant le modèle existant, je pense que cela vous permettra de générer et d'exécuter pour ARM :
- if "%PLATFORM%"=="visual_arm" (
cd cmake_unofficial &&
cmake . -DCMAKE_BUILD_TYPE=Release -A ARM &&
cmake --build . --config Release
)
Merci @v-strob pour l'astuce ! Ça vaut le coup d'essayer !
Cela devrait probablement fonctionner. Cela devrait corriger la compilation ARM et améliorer les performances 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
Fixé dans la branche dev
Commentaire le plus utile
Lorsque j'exécute ces étapes à l'aide de CMake et Visual Studio 2019 :
cd cmake_unofficial
mkdir build
cd build
cmake -G "Visual Studio 16 2019" -A ARM ..
cmake --build .
J'obtiens cette erreur :
Je n'ai pas beaucoup d'expérience avec appveyor.yml, mais en suivant le modèle existant, je pense que cela vous permettra de générer et d'exécuter pour ARM :