44# define FF_FUN ffcs_utf
51# define FF_FUN ffcs_2_utf
56# elif defined(FFCS_MASK)
58# define FF_FUN ffcs_mask_utf
60# define FF_FUN ffcs_mask
63# elif defined(FFCPS_0)
65# define FF_FUN ffcps_0_utf
67# define FF_FUN ffcps_0
70# elif defined (FFCPS_1)
72# define FF_FUN ffcps_1_utf
74# define FF_FUN ffcps_1
77# elif defined (FFCPS_DEFAULT)
79# define FF_FUN ffcps_default_utf
81# define FF_FUN ffcps_default
85#if (defined(__GNUC__) && __SANITIZE_ADDRESS__) \
86 || (defined(__clang__) \
87 && ((__clang_major__ == 3 && __clang_minor__ >= 3) || (__clang_major__ > 3)))
103vect_t vc1 = VDUPQ(c1);
107vect_t vc1 = VDUPQ(c1);
109vect_t vc2 = VDUPQ(c2);
111#elif defined(FFCS_MASK)
113vect_t vc1 = VDUPQ(c1);
115vect_t vmask = VDUPQ(mask);
119compare_type compare1_type = compare_match1;
120compare_type compare2_type = compare_match1;
121vect_t cmp1a, cmp1b, cmp2a, cmp2b;
122const sljit_u32 diff = IN_UCHARS(offs1 - offs2);
126# ifdef FFCPS_CHAR1A2A
127cmp1a = VDUPQ(char1a);
128cmp2a = VDUPQ(char2a);
136 cmp1a = VDUPQ(char1a);
142 if (is_powerof2(bit1))
144 compare1_type = compare_match1i;
145 cmp1a = VDUPQ(char1a | bit1);
150 compare1_type = compare_match2;
151 cmp1a = VDUPQ(char1a);
152 cmp1b = VDUPQ(char1b);
158 cmp2a = VDUPQ(char2a);
164 if (is_powerof2(bit2))
166 compare2_type = compare_match1i;
167 cmp2a = VDUPQ(char2a | bit2);
172 compare2_type = compare_match2;
173 cmp2a = VDUPQ(char2a);
174 cmp2b = VDUPQ(char2b);
179*str_ptr += IN_UCHARS(offs1);
182#if PCRE2_CODE_UNIT_WIDTH != 8
183vect_t char_mask = VDUPQ(0xff);
191if (*str_ptr >= str_end)
195sljit_s32 align_offset = ((uint64_t)*str_ptr & 0xf);
196*str_ptr = (
sljit_u8 *) ((uint64_t)*str_ptr & ~0xf);
197vect_t
data = VLD1Q(*str_ptr);
198#if PCRE2_CODE_UNIT_WIDTH != 8
203vect_t eq = VCEQQ(
data, vc1);
206vect_t eq1 = VCEQQ(
data, vc1);
207vect_t eq2 = VCEQQ(
data, vc2);
208vect_t eq = VORRQ(eq1, eq2);
210#elif defined(FFCS_MASK)
211vect_t eq = VORRQ(
data, vmask);
215# if defined(FFCPS_DIFF1)
216vect_t prev_data =
data;
222 data2 = VLD1Q(*str_ptr - diff);
223#if PCRE2_CODE_UNIT_WIDTH != 8
224 data2 = VANDQ(data2, char_mask);
228 data2 = shift_left_n_lanes(
data, offs1 - offs2);
230if (compare1_type == compare_match1)
233 data = fast_forward_char_pair_compare(compare1_type,
data, cmp1a, cmp1b);
235if (compare2_type == compare_match1)
236 data2 = VCEQQ(data2, cmp2a);
238 data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b);
240vect_t eq = VANDQ(
data, data2);
247 qw.dw[0] >>= align_offset * 8;
250 *str_ptr += align_offset + __builtin_ctzll(qw.dw[0]) / 8;
255 *str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
261 qw.dw[1] >>= (align_offset - 8) * 8;
264 *str_ptr += align_offset + __builtin_ctzll(qw.dw[1]) / 8;
270while (*str_ptr < str_end)
272 vect_t orig_data = VLD1Q(*str_ptr);
273#if PCRE2_CODE_UNIT_WIDTH != 8
274 orig_data = VANDQ(orig_data, char_mask);
279 eq = VCEQQ(
data, vc1);
282 eq1 = VCEQQ(
data, vc1);
283 eq2 = VCEQQ(
data, vc2);
284 eq = VORRQ(eq1, eq2);
286#elif defined(FFCS_MASK)
287 eq = VORRQ(
data, vmask);
292# if defined (FFCPS_DIFF1)
293 data2 = VEXTQ(prev_data,
data, VECTOR_FACTOR - 1);
295 data2 = VLD1Q(*str_ptr - diff);
296# if PCRE2_CODE_UNIT_WIDTH != 8
297 data2 = VANDQ(data2, char_mask);
301# ifdef FFCPS_CHAR1A2A
303 data2 = VCEQQ(data2, cmp2a);
305 if (compare1_type == compare_match1)
308 data = fast_forward_char_pair_compare(compare1_type,
data, cmp1a, cmp1b);
309 if (compare2_type == compare_match1)
310 data2 = VCEQQ(data2, cmp2a);
312 data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b);
315 eq = VANDQ(
data, data2);
320 *str_ptr += __builtin_ctzll(qw.dw[0]) / 8;
322 *str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
325#if defined (FFCPS_DIFF1)
326 prev_data = orig_data;
332 if (*str_ptr >= str_end)
337 if (utf_continue((
PCRE2_SPTR)*str_ptr - offs1))
340 *str_ptr += IN_UCHARS(1);
347 *str_ptr -= IN_UCHARS(offs1);
#define SLJIT_UNUSED_ARG(arg)
file_private int match(struct magic_set *, struct magic *, size_t, const struct buffer *, size_t, int, int, int, uint16_t *, uint16_t *, int *, int *, int *, int *, int *)