#include <algorithm>
#include <ctime>
#include <iostream>
#include <cstdint>
#include <x86intrin.h>

union U {
   __m128i sse;
   char chars[16];
};

void printSSE(__m128i r) {
   U u;
   u.sse = r;
   for(int i = 0; i < 16 ; i++) {
      std::cout << (int)(uint8_t)u.chars[i] << " ";
   }
   std::cout << std::endl;
}

void printSSEstr(__m128i r) {
   U u;
   u.sse = r;
   for(int i = 0; i < 16 ; i++) {
      std::cout << u.chars[i];
   }
   std::cout << std::endl;
}

uint64_t doIt(char* array, size_t size, uint64_t& result){


   // Primary loop
   for (size_t c = 0; c < size; c++)
   {
      if(array[c] == ','){
         result++;
      }
   }

}


uint64_t doItSSE(char* array, size_t size, uint64_t& result){


   __m128i mask = _mm_set_epi8(',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',');
   // Primary loop
   for (size_t c = 0; c < size; c+=16)
   {
      __m128i i = _mm_load_si128((__m128i*)(array+c));
      // NOW DO SOMETHING!
      __m128i cmp = _mm_cmpeq_epi8(i,mask);
      printSSEstr(i);
      printSSE(cmp);

   }
}

int main()
{
    // Fill data array with lorem ipsum text
    const size_t arraySize = 1 << 20;
    char data[arraySize];
    std::string c = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat";
    std::cout << "SIZE: " << c.size() << std::endl;
    for(size_t t = 0 ; t < arraySize ; t++) {
       data[t] = c[t%c.size()];
    }

    // Test
    clock_t start = clock();
    uint64_t sum = 0;

    for (unsigned i = 0; i < 1000; ++i)
    {
       doItSSE(data,arraySize,sum);
    }

    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;

    std::cout << elapsedTime << std::endl;
    std::cout << "sum = " << sum << std::endl;
}
