Режим для встроенного SSE4.2 _mm_cmpistrm - PullRequest
2 голосов
/ 11 июня 2011

Я пытаюсь выяснить, как установить флаг "mode" для встроенной функции _mm_cmpistrm SSE4.2.У меня есть обычная строка C (char *), которую я загружаю в тип __m128i с помощью _mm_lddqu_si128.Я собирался использовать неподписанные байты при обычном сравнении строк:

    _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH

Но я не совсем понимаю, что нужно установить для единицы измерения против битовой маски.Вот макросы из smmintrin.h в GCC 4.3.2:

    /* These macros specify the output selection in _mm_cmpXstrm ().  */
    #define _SIDD_BIT_MASK          0x00
    #define _SIDD_UNIT_MASK         0x40

Мне кажется, я понимаю, что такое битовая маска: я получу 1 в битах 0.15отличается между двумя строками.Но что делает маска модуля?

1 Ответ

3 голосов
/ 11 июня 2011

Для _SIDD_BIT_MASK вы получите маску со всеми 1, если строки равны, и со всеми 0, если они неравны; если вы делаете _SIDD_UBYTE_OPS, вы получите 16 бит (по одному на каждый символ в строке).

С _SIDD_UNIT_MASK, однако, вы получите ту же маску, но вместо этого расходуете до 16 байт . Например, биты 0..15 все будут равны 1, если сравнение первых двух символов в строке истинно. И биты 16..31 для символа два и т. Д.

...