forked from bytedance/sonic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathto_lower.c
35 lines (32 loc) · 984 Bytes
/
to_lower.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "native.h"
/**
* @brief uppercase to lowercase
* @param[in] src original string
* @param[in, out] dst lowercase string
* @param[in] len length of the string
*/
void to_lower(char* dst, const char* src, size_t len) {
const __m128i _A = _mm_set1_epi8('A' - 1);
const __m128i Z_ = _mm_set1_epi8('Z' + 1);
const __m128i delta = _mm_set1_epi8('a' - 'A');
char* q = dst;
while (len >= 16){
__m128i op = _mm_loadu_si128((__m128i*)src);
__m128i gt = _mm_cmpgt_epi8(op, _A);
__m128i lt = _mm_cmplt_epi8(op, Z_);
__m128i mingle = _mm_and_si128(gt, lt);
__m128i add = _mm_and_si128(mingle, delta);
__m128i lower = _mm_add_epi8(op, add);
_mm_storeu_si128((__m128i *)q, lower);
src += 16;
q += 16;
len -= 16;
};
while(len > 0) {
len--;
bool isUpper = (*src >= 'A' && *src <= 'Z');
*q = isUpper? (*src + 32): *src;
src++;
q++;
}
}