Mode pour _mm_cmpistrm SSE4.2 intrinsèque
-
26-10-2019 - |
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é?
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.