我正在尝试从_mm_cmpistrm返回一个_m128i位掩码,它指示128位源代码中的哪些字节包含空格。然而,我遇到了一些问题,因为当我将第一个和第三个字节设置为空格时,我得到的结果是{255,255,0,0,0,0,0,0,0,...},而不是{255,0,255,0,0,0,...}。
有没有人可以帮忙/开导?
#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;
}发布于 2013-10-20 05:28:30
两个可能的问题:
_SIDD_CMP_EQUAL_ANY,我认为你可能需要使用_SIDD_CMP_EQUAL_EACH -如果你做了这个更改,我认为你的结果将是5,0,0,0,...表示元素0和2处的匹配。注意:虽然我在SSE和AVX方面做了很多工作,但我从来没有使用过这些字符串指令,所以我只是基于对Intel文档的快速阅读得出上述观点。
https://stackoverflow.com/questions/19469289
复制相似问题