Files
stgsharp/内核源代码/StgSharp.C/string.c
T

55 lines
2.0 KiB
C

#include "StgSharpC.h"
#include "ssc_intrinsic.h"
int index_pair_sse(short const *str, uint32_t target, int length)
{
int index = 0, result = 0, size = length, end = size - 8;
__m128i s_even = { .m128i_u32 = {
target,
target,
target,
target,
} };
__m128i vec, com;
while (index < end) {
vec = _mm_loadu_epi32(str + index);
com = _mm_cmpeq_epi16(vec, s_even);
result = _mm_movemask_epi8(com);
if (result) {
for (size_t i = 0; i < 12; i++) {
result >>= 2;
if (((result & 0xF) == 0xF)) {
return index + i;
}
if (result == 0) {
break;
}
}
}
index += 1;
vec = _mm_loadu_epi32(str + index);
com = _mm_cmpeq_epi16(vec, s_even);
result = _mm_movemask_epi8(com);
if (result) {
for (size_t i = 0; i < 12; i++) {
result >>= 2;
if (((result & 0xF) == 0xF)) {
return index + i;
}
if (result == 0) {
break;
}
}
}
index += 7;
}
for (; (index < size - 1) && (!result); index += 2) {
result = *(int *)(str + index) == target;
}
if (result) {
return index;
}
return -1;
}