2016-01-20 4 views
0

Je teste l'instruction pcmpistr qui est un strchr() équivalent dans SSE mais j'obtiens l'erreur sur la valeur de retour, pour une raison quelconque le compilateur pense que la variable de type 'int' 'idx' est un vecteur, mais c'est un scalaire et il devrait stocker l'index du caractère trouvé dans la chaîne. Quel est le problème ici?compiler des instructions intrinsèques sse

[[email protected] test]$ cat pcmpistr.c 
#include <nmmintrin.h> 
#include <stdio.h> 

int main(int argc,char **argv) { 
    int idx; 
    char str1[16] __attribute__ ((aligned (16))) ={'G','E','T',' ','/','i','n','d','e','x','.','h','t','m','l','\n'} ; 
    char str2[1] __attribute__ ((aligned (16))) ={'\n'}; 
    __m128i *a,*b; 

    a=(__m128i*) str1; 
    b=(__m128i*) str2; 
    idx=_mm_cmpestri (a, 16, b, 1, _SIDD_UBYTE_OPS |_SIDD_CMP_EQUAL_ANY|_SIDD_LEAST_SIGNIFICANT); 

    printf("idx=%d\n",idx); 
} 
[[email protected] test]$ gcc -o pcmpstr pcmpistr.c 
pcmpistr.c: In function ‘main’: 
pcmpistr.c:13:2: error: can’t convert value to a vector 
    idx=_mm_cmpestri (a, 16, b, 1, _SIDD_UBYTE_OPS |_SIDD_CMP_EQUAL_ANY|_SIDD_LEAST_SIGNIFICANT); 
^
pcmpistr.c:13:2: error: can’t convert value to a vector 
[[email protected] test]$ 
+1

Je pense que vous devez déréférencer 'a' et' b'. – fuz

Répondre

1

@FUZxxl est juste, la signature de la fonction est donnée comme:

int _mm_cmpestri (
    __m128i a, 
    int la, 
    __m128i b, 
    int lb, 
    const int mode 
); 

Donc, vous devez déréférencer a et b:

idx=_mm_cmpestri (*a, 16, *b, 1, _SIDD_UBYTE_OPS |_SIDD_CMP_EQUAL_ANY|_SIDD_LEAST_SIGNIFICANT); 
+0

Oh, je vois. compilé mais cela ne fonctionne pas, il doit retourner 15 mais il renvoie 0. Est-ce que ça marche pour toi? – Nulik

+0

cela fonctionne, j'ai dû échanger a et b. damner, très pauvres docs sur sse – Nulik