Emscripten SIMD присваивает ошибку «неверное преобразование» - PullRequest
2 голосов
/ 04 ноября 2019

В соответствии с https://emscripten.org/docs/porting/simd.html, GCC / Clang SIMD Vector Extensions можно использовать. Однако я не могу скомпилировать следующее:

#include <emmintrin.h>
#include <stdint.h>

int stub_sse(void) {
    __m128i v1 = _mm_set1_epi32(42);
    __m128i v2 = _mm_set1_epi32(86);
    union { __m128i v; int32_t x[4]; } v3;
    v3.v = _mm_add_epi32(v1, v2);
    return (int) v3.x[0];
}

int main(void) { if (stub_sse() != 128) return 1; else return 0; }

Запуск emcc -msimd128 simd.c выдает множество ошибок, таких как

/emsdk/upstream/lib/clang/10.0.0/include/mmintrin.h:525:12: error:  
invalid conversion between vector type '__m64' (vector of 1 'long long' value)  
and integer type 'int' of different size
    return (__m64)__builtin_ia32_psubw((__v4hi)__m1, (__v4hi)__m2);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.

Я использую emcc upstream 1.39.1, clang 10.0.0, gcc 9.2.0 в Linux. Я что-то упустил?

1 Ответ

1 голос
/ 05 ноября 2019

Документы, в которых упоминается GCC / Clang SIMD Vector Extensions, приведены здесь: https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html. Эти документы объясняют, как использовать __attribute__((vector_size(16))) для именования векторных типов и объясняют операции, которые вы можете использовать для работы с этими типами. Эти операции, как правило, аналогичны операциям, которые вы можете использовать в обычных скалярных типах, таких как +, -, *, а также в логических операциях и подписке ([]). В частности, использование этих расширений не требует включения каких-либо заголовков или вызова каких-либо специальных функций, таких как _mm_set1_epi32.

Ваш код пытается использовать emmintrin.h, который является специфичным для платформы встроенным заголовком SIMD для x86. Если вы загляните внутрь emmintrin.h, то увидите, что он реализует типы, подобные __m128i, и функции, подобные _mm_set1_epi32, в терминах векторных расширений GCC / Clang SIMD, но сам заголовок не является частью векторных расширений. Единственный встроенный заголовок SIMD, доступный в настоящее время при использовании Emscripten, это wasm_simd128.h.

...