首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSE4 _mm_cmpistrm在字符串中查找字符(完整代码示例)

SSE4 _mm_cmpistrm在字符串中查找字符(完整代码示例)
EN

Stack Overflow用户
提问于 2013-10-20 02:05:59
回答 1查看 466关注 0票数 0

我正在尝试从_mm_cmpistrm返回一个_m128i位掩码,它指示128位源代码中的哪些字节包含空格。然而,我遇到了一些问题,因为当我将第一个和第三个字节设置为空格时,我得到的结果是{255,255,0,0,0,0,0,0,0,...},而不是{255,0,255,0,0,0,...}。

有没有人可以帮忙/开导?

代码语言:javascript
复制
#include <stdio.h>
#include <nmmintrin.h>
#include <iostream>

using namespace std;

int main ()
{
    __m128i a, b;

    const int mode = _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY  | _SIDD_LEAST_SIGNIFICANT;

    a.m128i_u8[15] = 't';   
    a.m128i_u8[14] = 'e';
    a.m128i_u8[13] = 's';
    a.m128i_u8[12] = 'o';
    a.m128i_u8[11] = 'd';
    a.m128i_u8[10] = 'i';
    a.m128i_u8[9] = 'f';
    a.m128i_u8[8] = 'g';
    a.m128i_u8[7] = 't';
    a.m128i_u8[6] = 'd';
    a.m128i_u8[5] = 'b';
    a.m128i_u8[4] = 'n';
    a.m128i_u8[3] = 'd';
    a.m128i_u8[2] = ' ';
    a.m128i_u8[1] = 'i';
    a.m128i_u8[0] = ' ';

    b.m128i_u8[15] = ' ';
    b.m128i_u8[14] = ' ';
    b.m128i_u8[13] = ' ';
    b.m128i_u8[12] = ' ';
    b.m128i_u8[11] = ' ';
    b.m128i_u8[10] = ' ';
    b.m128i_u8[9] = ' ';
    b.m128i_u8[8] = ' ';
    b.m128i_u8[7] = ' ';
    b.m128i_u8[6] = ' ';
    b.m128i_u8[5] = ' ';
    b.m128i_u8[4] = ' ';
    b.m128i_u8[3] = ' ';
    b.m128i_u8[2] = ' ';
    b.m128i_u8[1] = ' ';
    b.m128i_u8[0] = ' ';

    __m128i returnValue = _mm_cmpistrm(a, b, mode);

    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[0])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[1])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[2])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[3])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[4])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[5])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[6])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[7])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[8])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[9])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[10])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[11])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[12])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[13])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[14])) << endl;
    std::cout << int(static_cast<unsigned char>(returnValue.m128i_u8[15])) << endl;

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2013-10-20 05:28:30

两个可能的问题:

  • 我认为结果是一个压缩的16位字段,在结果向量的低位两个字节中,所以在这种情况下你的结果是16个真标志。
  • 你正在使用_SIDD_CMP_EQUAL_ANY,我认为你可能需要使用_SIDD_CMP_EQUAL_EACH -如果你做了这个更改,我认为你的结果将是5,0,0,0,...表示元素0和2处的匹配。

注意:虽然我在SSE和AVX方面做了很多工作,但我从来没有使用过这些字符串指令,所以我只是基于对Intel文档的快速阅读得出上述观点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19469289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档