fork download
  1. #pragma GCC target("sse4.1")
  2. #include <iostream>
  3. #include <immintrin.h>
  4. using namespace std;
  5.  
  6. int find(int a[], int n, int x) {
  7. __m128i needle = _mm_set_epi32(x, x, x, x);
  8. int i = 0;
  9. while(i+4 <= n) {
  10. __m128i dat = _mm_load_si128(reinterpret_cast<const __m128i*>(a + i));
  11. __m128i r = _mm_cmpeq_epi32(dat, needle);
  12. int msk = _mm_movemask_epi8(r);
  13. int xx = __builtin_clz(msk);
  14. if(msk) return i + ((32 - __builtin_clz(msk)) >> 2) - 1;
  15. i += 4;
  16. }
  17. while(i < n) {
  18. if(a[i] == x) return i;
  19. i++;
  20. }
  21. return -1;
  22. }
  23.  
  24. int main()
  25. {
  26. int a[] __attribute__((aligned(16))) = {1,4, 2, 5, -10, 12, 55, 3, -4, -5};
  27. int n = 10;
  28. int x = -10;
  29.  
  30. cout << find(a, n, 0) << endl;
  31. cout << find(a, n, 1) << endl;
  32. cout << find(a, n, 4) << endl;
  33. cout << find(a, n, 2) << endl;
  34. cout << find(a, n, 5) << endl;
  35. cout << find(a, n, -10) << endl;
  36. cout << find(a, n, 12) << endl;
  37. cout << find(a, n, -5) << endl;
  38.  
  39. return 0;
  40. }
  41.  
Success #stdin #stdout 0s 4484KB
stdin
Standard input is empty
stdout
-1
0
1
2
3
4
5
9