xref: /aosp_15_r20/external/pcre/src/pcre2_jit_neon_inc.h (revision 22dc650d8ae982c6770746019a6f94af92b0f024)
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