@@ -80,6 +80,24 @@ pg_lfind8_le(uint8 key, uint8 *base, uint32 nelem)
8080 return false;
8181}
8282
83+ /*
84+ * pg_lfind32_one_by_one_helper
85+ *
86+ * Searches the array of integers one-by-one. The caller is responsible for
87+ * ensuring that there are at least "nelem" integers in the array.
88+ */
89+ static inline bool
90+ pg_lfind32_one_by_one_helper (uint32 key , const uint32 * base , uint32 nelem )
91+ {
92+ for (uint32 i = 0 ; i < nelem ; i ++ )
93+ {
94+ if (key == base [i ])
95+ return true;
96+ }
97+
98+ return false;
99+ }
100+
83101#ifndef USE_NO_SIMD
84102/*
85103 * pg_lfind32_simd_helper
@@ -88,7 +106,7 @@ pg_lfind8_le(uint8 key, uint8 *base, uint32 nelem)
88106 * ensuring that there are at least 4-registers-worth of integers remaining.
89107 */
90108static inline bool
91- pg_lfind32_simd_helper (const Vector32 keys , uint32 * base )
109+ pg_lfind32_simd_helper (const Vector32 keys , const uint32 * base )
92110{
93111 const uint32 nelem_per_vector = sizeof (Vector32 ) / sizeof (uint32 );
94112 Vector32 vals1 ,
@@ -132,11 +150,10 @@ pg_lfind32_simd_helper(const Vector32 keys, uint32 *base)
132150 * return false.
133151 */
134152static inline bool
135- pg_lfind32 (uint32 key , uint32 * base , uint32 nelem )
153+ pg_lfind32 (uint32 key , const uint32 * base , uint32 nelem )
136154{
137- uint32 i = 0 ;
138-
139155#ifndef USE_NO_SIMD
156+ uint32 i = 0 ;
140157
141158 /*
142159 * For better instruction-level parallelism, each loop iteration operates
@@ -150,25 +167,15 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem)
150167 const uint32 tail_idx = nelem & ~(nelem_per_iteration - 1 );
151168
152169#if defined(USE_ASSERT_CHECKING )
153- bool assert_result = false;
154-
155- /* pre-compute the result for assert checking */
156- for (int j = 0 ; j < nelem ; j ++ )
157- {
158- if (key == base [j ])
159- {
160- assert_result = true;
161- break ;
162- }
163- }
170+ bool assert_result = pg_lfind32_one_by_one_helper (key , base , nelem );
164171#endif
165172
166173 /*
167- * If there aren't enough elements for the SIMD code, jump to the standard
174+ * If there aren't enough elements for the SIMD code, use the standard
168175 * one-by-one linear search code.
169176 */
170177 if (nelem < nelem_per_iteration )
171- goto one_by_one ;
178+ return pg_lfind32_one_by_one_helper ( key , base , nelem ) ;
172179
173180 /*
174181 * Process as many elements as possible with a block of 4 registers.
@@ -193,27 +200,10 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem)
193200 */
194201 Assert (assert_result == pg_lfind32_simd_helper (keys , & base [nelem - nelem_per_iteration ]));
195202 return pg_lfind32_simd_helper (keys , & base [nelem - nelem_per_iteration ]);
196-
197- one_by_one :
198-
199- #endif /* ! USE_NO_SIMD */
200-
203+ #else
201204 /* Process the elements one at a time. */
202- for (; i < nelem ; i ++ )
203- {
204- if (key == base [i ])
205- {
206- #ifndef USE_NO_SIMD
207- Assert (assert_result == true);
205+ return pg_lfind32_one_by_one_helper (key , base , nelem );
208206#endif
209- return true;
210- }
211- }
212-
213- #ifndef USE_NO_SIMD
214- Assert (assert_result == false);
215- #endif
216- return false;
217207}
218208
219209#endif /* PG_LFIND_H */
0 commit comments