stb _mm_slli_si128 最后一个参数必须是甚至无法编译的代码中的 8 位立即数

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

我最近切换到Linux,并且在我的一个项目中我一直使用stb来加载纹理。但是,当我包含 stb 头文件时,我收到一条如下所示的错误消息。

In function ‘__m128i _mm_slli_si128(__m128i, int)’,
    inlined from ‘stbi_uc* stbi__resample_row_hv_2_simd(stbi_uc*, stbi_uc*, stbi_uc*, int, int)’ at lib/stb/stb/stb_image.h:3359:32:
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.1/include/emmintrin.h:1229:10: error: the last argument must be an 8-bit immediate
 1229 |   return (__m128i)__builtin_ia32_pslldqi128 (__A, __N * 8);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function ‘__m128i _mm_srli_si128(__m128i, int)’,
    inlined from ‘stbi_uc* stbi__resample_row_hv_2_simd(stbi_uc*, stbi_uc*, stbi_uc*, int, int)’ at lib/stb/stb/stb_image.h:3360:32:
/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.1/include/emmintrin.h:1223:10: error: the last argument must be an 8-bit immediate
 1223 |   return (__m128i)__builtin_ia32_psrldqi128 (__A, __N * 8);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我查看了它,由于某种奇怪的原因,引发此问题的代码位于 #ifdef __OPTIMIZE __ 块内,甚至无法编译。就像字面意思一样,在 Visual studio Code 中,第 1223 行和 1229 行的代码显示为灰色,因为未定义 __OPTIMIZE __ (我在调试中运行)。

实际运行的代码

_mm_slli_si128
是:

__m128i prv0 = _mm_slli_si128(curr, 2);
__m128i nxt0 = _mm_srli_si128(curr, 2);

我正在 Manjaro KDE 上运行并使用 GCC 12.2.1 20230201。我知道第二个参数必须是编译器在编译时知道的东西,但它确实是这样,并且导致错误的整个事情甚至不应该编译我只是不知道该怎么办。

c++ linux g++
1个回答
0
投票

我已经解决了这个问题,但是我不记得4个月前是怎么解决的。

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