c语言 - 无法使用英特尔内部函数将值转换为矢量



我正在使用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);
...
}

相关内容

  • 没有找到相关文章

最新更新