2016-01-20 174 views
0

我正在測試pcmpistr指令,它是SSE中的strchr()等價物,但我得到返回值的錯誤,由於某種原因編譯器認爲'int'類型變量'idx'是一個向量,但它是一個標量,它應該存儲在字符串中找到的字符的索引。這裏有什麼問題?編譯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

我認爲你需要解除引用'a'和'b'。 – fuz

回答

1

@FUZxxl是正確的,給定函數的簽名:

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

所以,您需要取消引用a和b:

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

哦,我明白了。編譯它但它不起作用,它必須返回15,但它返回0。對你起作用嗎? – Nulik

+0

它的工作原理,我不得不交換a和b。大壩它,非常糟糕的文件在sse – Nulik