我正在使用Intel intrinsic并得到这个奇怪的错误。
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
My CPPFLAGS and 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))
指令要求内容要放入vector的字符串的。不是指针到字符串。使用memcpy
可能是实现它的最简单的方法。
static inline void parse_with_simd(const char *buffer, const int buffer_len) {
__m128i a, b;
// requires buffer_len be at most 16
memcpy(&a, buffer, buffer_len);
memcpy(&b, "GET ", 5);
int has_value = _mm_cmpestrc(a, 4, b, 4, _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH);
...
}