Question

Je suis en train de comprendre comment définir le drapeau « mode » pour le _mm_cmpistrm intrinsèque SSE4.2. J'ai une chaîne régulière C (char *) que je suis en charge un type de __m128i avec _mm_lddqu_si128. J'allais utiliser octets non signés avec comparaison de chaîne régulière:

    _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH

Mais je suis confus sur ce qu'il faut mettre pour l'unité contre masque de bits. Voici les macros de smmintrin.h dans GCC 4.3.2:

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

Je pense que je comprends ce que le masque de bits est: Je vais obtenir un 1 en bits 0..15 si le caractère dans cette position diffère entre les deux chaînes. Mais que fait le masque de l'unité?

Était-ce utile?

La solution

Pour _SIDD_BIT_MASK vous obtiendrez un masque qui est tout à 1 si les chaînes sont égales et tout 0 si elles sont inégales; si vous faites un _SIDD_UBYTE_OPS alors vous aurez 16 Mèches retourné (un pour chaque caractère de la chaîne).

Avec _SIDD_UNIT_MASK mais vous obtiendrez le même masque, mais Dépensées à 16 octets à la place. Par exemple, les bits 0..15 seront tous 1 si la comparaison des deux premiers caractères de la chaîne est vrai. Et les bits 16..31 pour deux caractères etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top