【发布时间】:2021-10-23 08:00:46
【问题描述】:
我正在使用 Intel Intrinsics 并遇到这个奇怪的错误。
src/header/header.c:18:3: error: can’t convert value to a vector
18 | int has_value = (int)_mm_cmpestrc(buffer, 4, u_str.vec, 4,
| ^~~
我尝试了以下没有(int) 演员,我也尝试了<nmmintrin.h>
#include "./header.h"
#ifdef __SIMD__
#include <x86intrin.h>
#endif
static inline void parse_with_simd(const char *buffer, const int buffer_len) {
union {
__m128i vec;
char * str;
} u_str = {.str = "GET "};
int has_value = (int)_mm_cmpestrc(buffer, 4, u_str.vec, 4,
_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH); // <-- this line
我的 CPPFLAGS 和 CFLAGS
CFLAGS = -Wall -O0 -std=c11 -g
CPPFLAGS = -DDEBUG -D__SIMD__
当我查看 _mm_cmpstrc 的定义时,它显示返回类型也是一个 int!
#define _mm_cmpestrc(A, LA, B, LB, M) \
(int)__builtin_ia32_pcmpestric128((__v16qi)(__m128i)(A), (int)(LA), \
(__v16qi)(__m128i)(B), (int)(LB), \
(int)(M))
【问题讨论】:
-
_mm_cmpestrc调用的第一个参数是char*- 这与the documentation 中指定的类型非常不同,它是__m128i.另请注意,宏扩展中的错误消息可能指向奇怪的地方。 -
... 使用 MSVC(和
nmmintrin.h标头),我得到这个:error C2440: 'function': cannot convert from 'const char *' to '__m128i'我> -
@AdrianMole 我添加了来自
(__m128i)buffer的演员表和同样的问题。我的理解是它们都是指向字符串数据的指针。 -
__m128i类型(很可能)由 C 编译器实现为struct或union。您不能将char*转换为struct。不确定您要做什么,因此无法提供太多帮助。 -
@AdrianMole,也许应该改成
char str[sizeof(__m128i)]。_mm_cmpestrc文档说字符串必须嵌入到向量中,而不是指向字符串的指针。
标签: c gcc x86 sse intrinsics