1*22dc650dSSadaf Ebrahimi /*************************************************
2*22dc650dSSadaf Ebrahimi * Perl-Compatible Regular Expressions *
3*22dc650dSSadaf Ebrahimi *************************************************/
4*22dc650dSSadaf Ebrahimi
5*22dc650dSSadaf Ebrahimi /* PCRE is a library of functions to support regular expressions whose syntax
6*22dc650dSSadaf Ebrahimi and semantics are as close as possible to those of the Perl 5 language.
7*22dc650dSSadaf Ebrahimi
8*22dc650dSSadaf Ebrahimi Written by Philip Hazel
9*22dc650dSSadaf Ebrahimi This module by Zoltan Herczeg and Sebastian Pop
10*22dc650dSSadaf Ebrahimi Original API code Copyright (c) 1997-2012 University of Cambridge
11*22dc650dSSadaf Ebrahimi New API code Copyright (c) 2016-2019 University of Cambridge
12*22dc650dSSadaf Ebrahimi
13*22dc650dSSadaf Ebrahimi -----------------------------------------------------------------------------
14*22dc650dSSadaf Ebrahimi Redistribution and use in source and binary forms, with or without
15*22dc650dSSadaf Ebrahimi modification, are permitted provided that the following conditions are met:
16*22dc650dSSadaf Ebrahimi
17*22dc650dSSadaf Ebrahimi * Redistributions of source code must retain the above copyright notice,
18*22dc650dSSadaf Ebrahimi this list of conditions and the following disclaimer.
19*22dc650dSSadaf Ebrahimi
20*22dc650dSSadaf Ebrahimi * Redistributions in binary form must reproduce the above copyright
21*22dc650dSSadaf Ebrahimi notice, this list of conditions and the following disclaimer in the
22*22dc650dSSadaf Ebrahimi documentation and/or other materials provided with the distribution.
23*22dc650dSSadaf Ebrahimi
24*22dc650dSSadaf Ebrahimi * Neither the name of the University of Cambridge nor the names of its
25*22dc650dSSadaf Ebrahimi contributors may be used to endorse or promote products derived from
26*22dc650dSSadaf Ebrahimi this software without specific prior written permission.
27*22dc650dSSadaf Ebrahimi
28*22dc650dSSadaf Ebrahimi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29*22dc650dSSadaf Ebrahimi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30*22dc650dSSadaf Ebrahimi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31*22dc650dSSadaf Ebrahimi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
32*22dc650dSSadaf Ebrahimi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33*22dc650dSSadaf Ebrahimi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34*22dc650dSSadaf Ebrahimi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35*22dc650dSSadaf Ebrahimi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36*22dc650dSSadaf Ebrahimi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37*22dc650dSSadaf Ebrahimi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*22dc650dSSadaf Ebrahimi POSSIBILITY OF SUCH DAMAGE.
39*22dc650dSSadaf Ebrahimi -----------------------------------------------------------------------------
40*22dc650dSSadaf Ebrahimi */
41*22dc650dSSadaf Ebrahimi
42*22dc650dSSadaf Ebrahimi # if defined(FFCS)
43*22dc650dSSadaf Ebrahimi # if defined(FF_UTF)
44*22dc650dSSadaf Ebrahimi # define FF_FUN ffcs_utf
45*22dc650dSSadaf Ebrahimi # else
46*22dc650dSSadaf Ebrahimi # define FF_FUN ffcs
47*22dc650dSSadaf Ebrahimi # endif
48*22dc650dSSadaf Ebrahimi
49*22dc650dSSadaf Ebrahimi # elif defined(FFCS_2)
50*22dc650dSSadaf Ebrahimi # if defined(FF_UTF)
51*22dc650dSSadaf Ebrahimi # define FF_FUN ffcs_2_utf
52*22dc650dSSadaf Ebrahimi # else
53*22dc650dSSadaf Ebrahimi # define FF_FUN ffcs_2
54*22dc650dSSadaf Ebrahimi # endif
55*22dc650dSSadaf Ebrahimi
56*22dc650dSSadaf Ebrahimi # elif defined(FFCS_MASK)
57*22dc650dSSadaf Ebrahimi # if defined(FF_UTF)
58*22dc650dSSadaf Ebrahimi # define FF_FUN ffcs_mask_utf
59*22dc650dSSadaf Ebrahimi # else
60*22dc650dSSadaf Ebrahimi # define FF_FUN ffcs_mask
61*22dc650dSSadaf Ebrahimi # endif
62*22dc650dSSadaf Ebrahimi
63*22dc650dSSadaf Ebrahimi # elif defined(FFCPS_0)
64*22dc650dSSadaf Ebrahimi # if defined (FF_UTF)
65*22dc650dSSadaf Ebrahimi # define FF_FUN ffcps_0_utf
66*22dc650dSSadaf Ebrahimi # else
67*22dc650dSSadaf Ebrahimi # define FF_FUN ffcps_0
68*22dc650dSSadaf Ebrahimi # endif
69*22dc650dSSadaf Ebrahimi
70*22dc650dSSadaf Ebrahimi # elif defined (FFCPS_1)
71*22dc650dSSadaf Ebrahimi # if defined (FF_UTF)
72*22dc650dSSadaf Ebrahimi # define FF_FUN ffcps_1_utf
73*22dc650dSSadaf Ebrahimi # else
74*22dc650dSSadaf Ebrahimi # define FF_FUN ffcps_1
75*22dc650dSSadaf Ebrahimi # endif
76*22dc650dSSadaf Ebrahimi
77*22dc650dSSadaf Ebrahimi # elif defined (FFCPS_DEFAULT)
78*22dc650dSSadaf Ebrahimi # if defined (FF_UTF)
79*22dc650dSSadaf Ebrahimi # define FF_FUN ffcps_default_utf
80*22dc650dSSadaf Ebrahimi # else
81*22dc650dSSadaf Ebrahimi # define FF_FUN ffcps_default
82*22dc650dSSadaf Ebrahimi # endif
83*22dc650dSSadaf Ebrahimi # endif
84*22dc650dSSadaf Ebrahimi
85*22dc650dSSadaf Ebrahimi #if (defined(__GNUC__) && __SANITIZE_ADDRESS__) \
86*22dc650dSSadaf Ebrahimi || (defined(__clang__) \
87*22dc650dSSadaf Ebrahimi && ((__clang_major__ == 3 && __clang_minor__ >= 3) || (__clang_major__ > 3)))
88*22dc650dSSadaf Ebrahimi __attribute__((no_sanitize_address))
89*22dc650dSSadaf Ebrahimi #endif
FF_FUN(sljit_u8 * str_end,sljit_u8 ** str_ptr,sljit_uw offs1,sljit_uw offs2,sljit_uw chars)90*22dc650dSSadaf Ebrahimi static sljit_u8* SLJIT_FUNC FF_FUN(sljit_u8 *str_end, sljit_u8 **str_ptr, sljit_uw offs1, sljit_uw offs2, sljit_uw chars)
91*22dc650dSSadaf Ebrahimi #undef FF_FUN
92*22dc650dSSadaf Ebrahimi {
93*22dc650dSSadaf Ebrahimi quad_word qw;
94*22dc650dSSadaf Ebrahimi int_char ic;
95*22dc650dSSadaf Ebrahimi
96*22dc650dSSadaf Ebrahimi SLJIT_UNUSED_ARG(offs1);
97*22dc650dSSadaf Ebrahimi SLJIT_UNUSED_ARG(offs2);
98*22dc650dSSadaf Ebrahimi
99*22dc650dSSadaf Ebrahimi ic.x = chars;
100*22dc650dSSadaf Ebrahimi
101*22dc650dSSadaf Ebrahimi #if defined(FFCS)
102*22dc650dSSadaf Ebrahimi sljit_u8 c1 = ic.c.c1;
103*22dc650dSSadaf Ebrahimi vect_t vc1 = VDUPQ(c1);
104*22dc650dSSadaf Ebrahimi
105*22dc650dSSadaf Ebrahimi #elif defined(FFCS_2)
106*22dc650dSSadaf Ebrahimi sljit_u8 c1 = ic.c.c1;
107*22dc650dSSadaf Ebrahimi vect_t vc1 = VDUPQ(c1);
108*22dc650dSSadaf Ebrahimi sljit_u8 c2 = ic.c.c2;
109*22dc650dSSadaf Ebrahimi vect_t vc2 = VDUPQ(c2);
110*22dc650dSSadaf Ebrahimi
111*22dc650dSSadaf Ebrahimi #elif defined(FFCS_MASK)
112*22dc650dSSadaf Ebrahimi sljit_u8 c1 = ic.c.c1;
113*22dc650dSSadaf Ebrahimi vect_t vc1 = VDUPQ(c1);
114*22dc650dSSadaf Ebrahimi sljit_u8 mask = ic.c.c2;
115*22dc650dSSadaf Ebrahimi vect_t vmask = VDUPQ(mask);
116*22dc650dSSadaf Ebrahimi #endif
117*22dc650dSSadaf Ebrahimi
118*22dc650dSSadaf Ebrahimi #if defined(FFCPS)
119*22dc650dSSadaf Ebrahimi compare_type compare1_type = compare_match1;
120*22dc650dSSadaf Ebrahimi compare_type compare2_type = compare_match1;
121*22dc650dSSadaf Ebrahimi vect_t cmp1a, cmp1b, cmp2a, cmp2b;
122*22dc650dSSadaf Ebrahimi const sljit_u32 diff = IN_UCHARS(offs1 - offs2);
123*22dc650dSSadaf Ebrahimi PCRE2_UCHAR char1a = ic.c.c1;
124*22dc650dSSadaf Ebrahimi PCRE2_UCHAR char2a = ic.c.c3;
125*22dc650dSSadaf Ebrahimi
126*22dc650dSSadaf Ebrahimi # ifdef FFCPS_CHAR1A2A
127*22dc650dSSadaf Ebrahimi cmp1a = VDUPQ(char1a);
128*22dc650dSSadaf Ebrahimi cmp2a = VDUPQ(char2a);
129*22dc650dSSadaf Ebrahimi cmp1b = VDUPQ(0); /* to avoid errors on older compilers -Werror=maybe-uninitialized */
130*22dc650dSSadaf Ebrahimi cmp2b = VDUPQ(0); /* to avoid errors on older compilers -Werror=maybe-uninitialized */
131*22dc650dSSadaf Ebrahimi # else
132*22dc650dSSadaf Ebrahimi PCRE2_UCHAR char1b = ic.c.c2;
133*22dc650dSSadaf Ebrahimi PCRE2_UCHAR char2b = ic.c.c4;
134*22dc650dSSadaf Ebrahimi if (char1a == char1b)
135*22dc650dSSadaf Ebrahimi {
136*22dc650dSSadaf Ebrahimi cmp1a = VDUPQ(char1a);
137*22dc650dSSadaf Ebrahimi cmp1b = VDUPQ(0); /* to avoid errors on older compilers -Werror=maybe-uninitialized */
138*22dc650dSSadaf Ebrahimi }
139*22dc650dSSadaf Ebrahimi else
140*22dc650dSSadaf Ebrahimi {
141*22dc650dSSadaf Ebrahimi sljit_u32 bit1 = char1a ^ char1b;
142*22dc650dSSadaf Ebrahimi if (is_powerof2(bit1))
143*22dc650dSSadaf Ebrahimi {
144*22dc650dSSadaf Ebrahimi compare1_type = compare_match1i;
145*22dc650dSSadaf Ebrahimi cmp1a = VDUPQ(char1a | bit1);
146*22dc650dSSadaf Ebrahimi cmp1b = VDUPQ(bit1);
147*22dc650dSSadaf Ebrahimi }
148*22dc650dSSadaf Ebrahimi else
149*22dc650dSSadaf Ebrahimi {
150*22dc650dSSadaf Ebrahimi compare1_type = compare_match2;
151*22dc650dSSadaf Ebrahimi cmp1a = VDUPQ(char1a);
152*22dc650dSSadaf Ebrahimi cmp1b = VDUPQ(char1b);
153*22dc650dSSadaf Ebrahimi }
154*22dc650dSSadaf Ebrahimi }
155*22dc650dSSadaf Ebrahimi
156*22dc650dSSadaf Ebrahimi if (char2a == char2b)
157*22dc650dSSadaf Ebrahimi {
158*22dc650dSSadaf Ebrahimi cmp2a = VDUPQ(char2a);
159*22dc650dSSadaf Ebrahimi cmp2b = VDUPQ(0); /* to avoid errors on older compilers -Werror=maybe-uninitialized */
160*22dc650dSSadaf Ebrahimi }
161*22dc650dSSadaf Ebrahimi else
162*22dc650dSSadaf Ebrahimi {
163*22dc650dSSadaf Ebrahimi sljit_u32 bit2 = char2a ^ char2b;
164*22dc650dSSadaf Ebrahimi if (is_powerof2(bit2))
165*22dc650dSSadaf Ebrahimi {
166*22dc650dSSadaf Ebrahimi compare2_type = compare_match1i;
167*22dc650dSSadaf Ebrahimi cmp2a = VDUPQ(char2a | bit2);
168*22dc650dSSadaf Ebrahimi cmp2b = VDUPQ(bit2);
169*22dc650dSSadaf Ebrahimi }
170*22dc650dSSadaf Ebrahimi else
171*22dc650dSSadaf Ebrahimi {
172*22dc650dSSadaf Ebrahimi compare2_type = compare_match2;
173*22dc650dSSadaf Ebrahimi cmp2a = VDUPQ(char2a);
174*22dc650dSSadaf Ebrahimi cmp2b = VDUPQ(char2b);
175*22dc650dSSadaf Ebrahimi }
176*22dc650dSSadaf Ebrahimi }
177*22dc650dSSadaf Ebrahimi # endif
178*22dc650dSSadaf Ebrahimi
179*22dc650dSSadaf Ebrahimi *str_ptr += IN_UCHARS(offs1);
180*22dc650dSSadaf Ebrahimi #endif
181*22dc650dSSadaf Ebrahimi
182*22dc650dSSadaf Ebrahimi #if PCRE2_CODE_UNIT_WIDTH != 8
183*22dc650dSSadaf Ebrahimi vect_t char_mask = VDUPQ(0xff);
184*22dc650dSSadaf Ebrahimi #endif
185*22dc650dSSadaf Ebrahimi
186*22dc650dSSadaf Ebrahimi #if defined(FF_UTF)
187*22dc650dSSadaf Ebrahimi restart:;
188*22dc650dSSadaf Ebrahimi #endif
189*22dc650dSSadaf Ebrahimi
190*22dc650dSSadaf Ebrahimi #if defined(FFCPS)
191*22dc650dSSadaf Ebrahimi if (*str_ptr >= str_end)
192*22dc650dSSadaf Ebrahimi return NULL;
193*22dc650dSSadaf Ebrahimi sljit_u8 *p1 = *str_ptr - diff;
194*22dc650dSSadaf Ebrahimi #endif
195*22dc650dSSadaf Ebrahimi sljit_s32 align_offset = ((uint64_t)*str_ptr & 0xf);
196*22dc650dSSadaf Ebrahimi *str_ptr = (sljit_u8 *) ((uint64_t)*str_ptr & ~0xf);
197*22dc650dSSadaf Ebrahimi vect_t data = VLD1Q(*str_ptr);
198*22dc650dSSadaf Ebrahimi #if PCRE2_CODE_UNIT_WIDTH != 8
199*22dc650dSSadaf Ebrahimi data = VANDQ(data, char_mask);
200*22dc650dSSadaf Ebrahimi #endif
201*22dc650dSSadaf Ebrahimi
202*22dc650dSSadaf Ebrahimi #if defined(FFCS)
203*22dc650dSSadaf Ebrahimi vect_t eq = VCEQQ(data, vc1);
204*22dc650dSSadaf Ebrahimi
205*22dc650dSSadaf Ebrahimi #elif defined(FFCS_2)
206*22dc650dSSadaf Ebrahimi vect_t eq1 = VCEQQ(data, vc1);
207*22dc650dSSadaf Ebrahimi vect_t eq2 = VCEQQ(data, vc2);
208*22dc650dSSadaf Ebrahimi vect_t eq = VORRQ(eq1, eq2);
209*22dc650dSSadaf Ebrahimi
210*22dc650dSSadaf Ebrahimi #elif defined(FFCS_MASK)
211*22dc650dSSadaf Ebrahimi vect_t eq = VORRQ(data, vmask);
212*22dc650dSSadaf Ebrahimi eq = VCEQQ(eq, vc1);
213*22dc650dSSadaf Ebrahimi
214*22dc650dSSadaf Ebrahimi #elif defined(FFCPS)
215*22dc650dSSadaf Ebrahimi # if defined(FFCPS_DIFF1)
216*22dc650dSSadaf Ebrahimi vect_t prev_data = data;
217*22dc650dSSadaf Ebrahimi # endif
218*22dc650dSSadaf Ebrahimi
219*22dc650dSSadaf Ebrahimi vect_t data2;
220*22dc650dSSadaf Ebrahimi if (p1 < *str_ptr)
221*22dc650dSSadaf Ebrahimi {
222*22dc650dSSadaf Ebrahimi data2 = VLD1Q(*str_ptr - diff);
223*22dc650dSSadaf Ebrahimi #if PCRE2_CODE_UNIT_WIDTH != 8
224*22dc650dSSadaf Ebrahimi data2 = VANDQ(data2, char_mask);
225*22dc650dSSadaf Ebrahimi #endif
226*22dc650dSSadaf Ebrahimi }
227*22dc650dSSadaf Ebrahimi else
228*22dc650dSSadaf Ebrahimi data2 = shift_left_n_lanes(data, offs1 - offs2);
229*22dc650dSSadaf Ebrahimi
230*22dc650dSSadaf Ebrahimi if (compare1_type == compare_match1)
231*22dc650dSSadaf Ebrahimi data = VCEQQ(data, cmp1a);
232*22dc650dSSadaf Ebrahimi else
233*22dc650dSSadaf Ebrahimi data = fast_forward_char_pair_compare(compare1_type, data, cmp1a, cmp1b);
234*22dc650dSSadaf Ebrahimi
235*22dc650dSSadaf Ebrahimi if (compare2_type == compare_match1)
236*22dc650dSSadaf Ebrahimi data2 = VCEQQ(data2, cmp2a);
237*22dc650dSSadaf Ebrahimi else
238*22dc650dSSadaf Ebrahimi data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b);
239*22dc650dSSadaf Ebrahimi
240*22dc650dSSadaf Ebrahimi vect_t eq = VANDQ(data, data2);
241*22dc650dSSadaf Ebrahimi #endif
242*22dc650dSSadaf Ebrahimi
243*22dc650dSSadaf Ebrahimi VST1Q(qw.mem, eq);
244*22dc650dSSadaf Ebrahimi /* Ignore matches before the first STR_PTR. */
245*22dc650dSSadaf Ebrahimi if (align_offset < 8)
246*22dc650dSSadaf Ebrahimi {
247*22dc650dSSadaf Ebrahimi qw.dw[0] >>= align_offset * 8;
248*22dc650dSSadaf Ebrahimi if (qw.dw[0])
249*22dc650dSSadaf Ebrahimi {
250*22dc650dSSadaf Ebrahimi *str_ptr += align_offset + __builtin_ctzll(qw.dw[0]) / 8;
251*22dc650dSSadaf Ebrahimi goto match;
252*22dc650dSSadaf Ebrahimi }
253*22dc650dSSadaf Ebrahimi if (qw.dw[1])
254*22dc650dSSadaf Ebrahimi {
255*22dc650dSSadaf Ebrahimi *str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
256*22dc650dSSadaf Ebrahimi goto match;
257*22dc650dSSadaf Ebrahimi }
258*22dc650dSSadaf Ebrahimi }
259*22dc650dSSadaf Ebrahimi else
260*22dc650dSSadaf Ebrahimi {
261*22dc650dSSadaf Ebrahimi qw.dw[1] >>= (align_offset - 8) * 8;
262*22dc650dSSadaf Ebrahimi if (qw.dw[1])
263*22dc650dSSadaf Ebrahimi {
264*22dc650dSSadaf Ebrahimi *str_ptr += align_offset + __builtin_ctzll(qw.dw[1]) / 8;
265*22dc650dSSadaf Ebrahimi goto match;
266*22dc650dSSadaf Ebrahimi }
267*22dc650dSSadaf Ebrahimi }
268*22dc650dSSadaf Ebrahimi *str_ptr += 16;
269*22dc650dSSadaf Ebrahimi
270*22dc650dSSadaf Ebrahimi while (*str_ptr < str_end)
271*22dc650dSSadaf Ebrahimi {
272*22dc650dSSadaf Ebrahimi vect_t orig_data = VLD1Q(*str_ptr);
273*22dc650dSSadaf Ebrahimi #if PCRE2_CODE_UNIT_WIDTH != 8
274*22dc650dSSadaf Ebrahimi orig_data = VANDQ(orig_data, char_mask);
275*22dc650dSSadaf Ebrahimi #endif
276*22dc650dSSadaf Ebrahimi data = orig_data;
277*22dc650dSSadaf Ebrahimi
278*22dc650dSSadaf Ebrahimi #if defined(FFCS)
279*22dc650dSSadaf Ebrahimi eq = VCEQQ(data, vc1);
280*22dc650dSSadaf Ebrahimi
281*22dc650dSSadaf Ebrahimi #elif defined(FFCS_2)
282*22dc650dSSadaf Ebrahimi eq1 = VCEQQ(data, vc1);
283*22dc650dSSadaf Ebrahimi eq2 = VCEQQ(data, vc2);
284*22dc650dSSadaf Ebrahimi eq = VORRQ(eq1, eq2);
285*22dc650dSSadaf Ebrahimi
286*22dc650dSSadaf Ebrahimi #elif defined(FFCS_MASK)
287*22dc650dSSadaf Ebrahimi eq = VORRQ(data, vmask);
288*22dc650dSSadaf Ebrahimi eq = VCEQQ(eq, vc1);
289*22dc650dSSadaf Ebrahimi #endif
290*22dc650dSSadaf Ebrahimi
291*22dc650dSSadaf Ebrahimi #if defined(FFCPS)
292*22dc650dSSadaf Ebrahimi # if defined (FFCPS_DIFF1)
293*22dc650dSSadaf Ebrahimi data2 = VEXTQ(prev_data, data, VECTOR_FACTOR - 1);
294*22dc650dSSadaf Ebrahimi # else
295*22dc650dSSadaf Ebrahimi data2 = VLD1Q(*str_ptr - diff);
296*22dc650dSSadaf Ebrahimi # if PCRE2_CODE_UNIT_WIDTH != 8
297*22dc650dSSadaf Ebrahimi data2 = VANDQ(data2, char_mask);
298*22dc650dSSadaf Ebrahimi # endif
299*22dc650dSSadaf Ebrahimi # endif
300*22dc650dSSadaf Ebrahimi
301*22dc650dSSadaf Ebrahimi # ifdef FFCPS_CHAR1A2A
302*22dc650dSSadaf Ebrahimi data = VCEQQ(data, cmp1a);
303*22dc650dSSadaf Ebrahimi data2 = VCEQQ(data2, cmp2a);
304*22dc650dSSadaf Ebrahimi # else
305*22dc650dSSadaf Ebrahimi if (compare1_type == compare_match1)
306*22dc650dSSadaf Ebrahimi data = VCEQQ(data, cmp1a);
307*22dc650dSSadaf Ebrahimi else
308*22dc650dSSadaf Ebrahimi data = fast_forward_char_pair_compare(compare1_type, data, cmp1a, cmp1b);
309*22dc650dSSadaf Ebrahimi if (compare2_type == compare_match1)
310*22dc650dSSadaf Ebrahimi data2 = VCEQQ(data2, cmp2a);
311*22dc650dSSadaf Ebrahimi else
312*22dc650dSSadaf Ebrahimi data2 = fast_forward_char_pair_compare(compare2_type, data2, cmp2a, cmp2b);
313*22dc650dSSadaf Ebrahimi # endif
314*22dc650dSSadaf Ebrahimi
315*22dc650dSSadaf Ebrahimi eq = VANDQ(data, data2);
316*22dc650dSSadaf Ebrahimi #endif
317*22dc650dSSadaf Ebrahimi
318*22dc650dSSadaf Ebrahimi VST1Q(qw.mem, eq);
319*22dc650dSSadaf Ebrahimi if (qw.dw[0])
320*22dc650dSSadaf Ebrahimi *str_ptr += __builtin_ctzll(qw.dw[0]) / 8;
321*22dc650dSSadaf Ebrahimi else if (qw.dw[1])
322*22dc650dSSadaf Ebrahimi *str_ptr += 8 + __builtin_ctzll(qw.dw[1]) / 8;
323*22dc650dSSadaf Ebrahimi else {
324*22dc650dSSadaf Ebrahimi *str_ptr += 16;
325*22dc650dSSadaf Ebrahimi #if defined (FFCPS_DIFF1)
326*22dc650dSSadaf Ebrahimi prev_data = orig_data;
327*22dc650dSSadaf Ebrahimi #endif
328*22dc650dSSadaf Ebrahimi continue;
329*22dc650dSSadaf Ebrahimi }
330*22dc650dSSadaf Ebrahimi
331*22dc650dSSadaf Ebrahimi match:;
332*22dc650dSSadaf Ebrahimi if (*str_ptr >= str_end)
333*22dc650dSSadaf Ebrahimi /* Failed match. */
334*22dc650dSSadaf Ebrahimi return NULL;
335*22dc650dSSadaf Ebrahimi
336*22dc650dSSadaf Ebrahimi #if defined(FF_UTF)
337*22dc650dSSadaf Ebrahimi if (utf_continue((PCRE2_SPTR)*str_ptr - offs1))
338*22dc650dSSadaf Ebrahimi {
339*22dc650dSSadaf Ebrahimi /* Not a match. */
340*22dc650dSSadaf Ebrahimi *str_ptr += IN_UCHARS(1);
341*22dc650dSSadaf Ebrahimi goto restart;
342*22dc650dSSadaf Ebrahimi }
343*22dc650dSSadaf Ebrahimi #endif
344*22dc650dSSadaf Ebrahimi
345*22dc650dSSadaf Ebrahimi /* Match. */
346*22dc650dSSadaf Ebrahimi #if defined (FFCPS)
347*22dc650dSSadaf Ebrahimi *str_ptr -= IN_UCHARS(offs1);
348*22dc650dSSadaf Ebrahimi #endif
349*22dc650dSSadaf Ebrahimi return *str_ptr;
350*22dc650dSSadaf Ebrahimi }
351*22dc650dSSadaf Ebrahimi
352*22dc650dSSadaf Ebrahimi /* Failed match. */
353*22dc650dSSadaf Ebrahimi return NULL;
354*22dc650dSSadaf Ebrahimi }
355