32 lines
1.1 KiB
C
32 lines
1.1 KiB
C
#include "StgSharpC.h"
|
|
#include "ssc_intrinsic.h"
|
|
|
|
int index_pair_sse(byte const *str, uint32_t target, int length)
|
|
{
|
|
int index = 0, result = 0, size = length << 1, end = size - 14;
|
|
__m128i source = { .m128i_i32 = {
|
|
target,
|
|
target,
|
|
target,
|
|
target,
|
|
} };
|
|
for (; (index < end) && (!result); index += 14) { // move 7*2 bytes instead of 8*2
|
|
__m128i vec = _mm_loadu_epi32(str + index);
|
|
__m128i com = _mm_cmpeq_epi32(vec, source);
|
|
result = _mm_movemask_epi8(com);
|
|
}
|
|
if (result) {
|
|
for (; result; result >> 2) {
|
|
index++;
|
|
}
|
|
return index;
|
|
}
|
|
for (; (index < size - 2) && (!result); index += 2) {
|
|
result = *(int *)(str + index) == target;
|
|
}
|
|
if (result) {
|
|
return index;
|
|
}
|
|
return -1;
|
|
}
|