Emscripten SIMD内部函数无效转换错误

问题描述 投票:2回答:1

根据https://emscripten.org/docs/porting/simd.html,可以使用GCC / Clang SIMD矢量扩展名。但是,我无法编译以下内容:

#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.

我正在Linux上使用emcc上游1.39.1,clang 10.0.0,gcc 9.2.0。我想念什么吗?

emscripten
1个回答
0
投票

提到GCC / Clang SIMD矢量扩展的文档在这里链接:https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html。这些文档解释了如何使用__attribute__((vector_size(16)))来命名向量类型,并解释了可用于处理这些类型的操作。这些操作通常与可以在常规标量类型(例如+-*)上使用的操作以及逻辑操作和下标([])相同。值得注意的是,使用这些扩展不需要包含任何标题或调用任何特殊功能,例如_mm_set1_epi32

您的代码尝试使用emmintrin.h,这是针对x86的特定于平台的SIMD内部函数标头。如果您查看emmintrin.h的内容,就GCC / Clang SIMD矢量扩展而言,它将实现__m128i之类的类型和_mm_set1_epi32之类的功能,但标头本身并不是矢量扩展的一部分。当前使用Emscripten时唯一可用的SIMD内部函数标头是wasm_simd128.h

© www.soinside.com 2019 - 2024. All rights reserved.