查找下一个 Ascii Space,_mm_cmpeq_epi8 返回 0

Finding Next Ascii Space With _mm_cmpeq_epi8 Returning 0

我将这个字符串传递到我的解析路由方法中。

  route_start = 4;
  parse_route_simd("GET /0000_0000_/ HTTP/1.1\r\n", 27);
  assert(route_end == 15);
const char spaces[17] __attribute__((aligned(16))) = "                [=13=]";

 void parse_route_simd(const char *buffer, const int buffer_len) {
  int index_simd;
  int curr_index = route_start;
  register __m128i xmm0, xmm1, xmm2;
  register unsigned int eax;
  register unsigned char ebx;
  while (buffer_len - curr_index >= 16) {
    debug_print("route_start %d\nindex_simd %d\nbuff %s\nspaces :%s:\n",
                route_start, index_simd, buffer + curr_index, spaces);
    xmm0 = _mm_loadu_si128((const __m128i *)buffer + curr_index);
    xmm1 = _mm_loadu_si128((const __m128i *)spaces);
    xmm2 = _mm_cmpeq_epi8(xmm0, xmm1);
    eax = _mm_movemask_epi8(xmm2);
    debug_print("eax %d\n", eax);
    index_simd = __builtin_ffsll(eax);

我快疯了,因为我不明白为什么这段代码中的 eax 返回 0;

(const __m128i *)buffer + curr_index是个问题。
您需要 (const __m128i *)(buffer + curr_index) 进行 char* 地址计算, 然后 转换为 __m128i*.

强制转换的运算符优先级高于 +

另一个避免这个错误的常用技巧是(__m128i*) &buffer[curr_index]

调试器应该显示使用 curr_index = 1,您正在从 16 个字节加载到数组中,向前移动一个 __m128i,因为这是加法中涉及的指针类型。