Juste vieux trucs d'Intel étant moins bien écrit que leur nouvelles choses, en supposant une amélioration const
considérer.
Notez que blend_epi16
est SSE4.1, tandis que srli_si128
est SSE2. Probablement, ils ont décidé de renforcer le point que l'argument doit être une constante à la compilation quand ils ont ajouté des intrinsèques pour SSE4.1.
L'AVX2 intrinsèque pour la version 256 bits utilise const: __m256i _mm256_srli_si256 (__m256i a, const int imm)
. Cela confirme essentiellement qu'ils n'avaient pas encore pensé à const
, puisqu'ils ont commencé à utiliser const
pour la même instruction.
Notez également qu'ils étaient si malheureux avec le nom _mm_srli_si128
pour le psrldq
instruction qu'ils ont introduit un nouveau nom pour elle: _mm_bsrli_si128
devrait être préféré dans le nouveau code, pour le rend plus il est un octet de décalage, pas un 128bit large bit -décalage. C'est très différent de _mm_srli_epi64
. Le manuel de référence de l'instruction ne mentionne malheureusement pas le nom bsrli
.
AVX512 intrinsics chargement/stockage utilisera void*
au lieu de __m128i*
, ce qui est un autre changement agréable. Donc, fondamentalement, Intel fait les choses différemment parce que l'ancienne façon était sous-optimale, et non parce qu'ils le doivent.
Intéressant, d'après mes identifiants erreurs non trouvées, _mm_bsrli_si128 n'est pas disponible dans VS 2015. Cependant, _mm_srli_si128 est disponible. – Thomas
@Volatile: c'est malheureux. [Le guide intrinsèques d'Intel le répertorie] (https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE,SSE2,SSE3,SSSE3,SSE4_1,SSE4_2,AVX,AVX2,Other&text=bsrli&expand=552), et gcc/clang le supportent. Peut-être que ce n'est pas vraiment standard. J'aurais aimé que ce soit, parce que c'est évidemment plus clair. C'est vraiment dommage que ce ne soit pas portable pour MSVC. Vous avez inclus le 'fourre-tout' immintrin.h ou 'x86intrin.h', non? –
Oui, j'obtiens l'erreur d'identifiant avec immintrin.h inclus. – Thomas