@@ -63,6 +63,8 @@ struct generate_json_data {
6363 long depth ;
6464};
6565
66+ static SIMD_Implementation simd_impl ;
67+
6668static VALUE cState_from_state_s (VALUE self , VALUE opts );
6769static VALUE cState_partial_generate (VALUE self , VALUE obj , generator_func , VALUE io );
6870static void generate_json (FBuffer * buffer , struct generate_json_data * data , VALUE obj );
@@ -155,8 +157,6 @@ static const unsigned char escape_table_basic[256] = {
155157 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
156158};
157159
158- static unsigned char (* search_escape_basic_impl )(search_state * );
159-
160160static inline unsigned char search_escape_basic (search_state * search )
161161{
162162 while (search -> ptr < search -> end ) {
@@ -212,11 +212,39 @@ ALWAYS_INLINE(static) void escape_UTF8_char_basic(search_state *search)
212212 * Everything else (should be UTF-8) is just passed through and
213213 * appended to the result.
214214 */
215+
216+
217+ #if defined(HAVE_SIMD_NEON )
218+ static inline unsigned char search_escape_basic_neon (search_state * search );
219+ #elif defined(HAVE_SIMD_SSE2 )
220+ static inline unsigned char search_escape_basic_sse2 (search_state * search );
221+ #endif
222+
223+ static inline unsigned char search_escape_basic (search_state * search );
224+
215225static inline void convert_UTF8_to_JSON (search_state * search )
216226{
217- while (search_escape_basic_impl (search )) {
227+ #ifdef HAVE_SIMD
228+ #if defined(HAVE_SIMD_NEON )
229+ while (search_escape_basic_neon (search )) {
230+ escape_UTF8_char_basic (search );
231+ }
232+ #elif defined(HAVE_SIMD_SSE2 )
233+ if (simd_impl == SIMD_SSE2 ) {
234+ while (search_escape_basic_sse2 (search )) {
235+ escape_UTF8_char_basic (search );
236+ }
237+ return ;
238+ }
239+ while (search_escape_basic (search )) {
240+ escape_UTF8_char_basic (search );
241+ }
242+ #endif
243+ #else
244+ while (search_escape_basic (search )) {
218245 escape_UTF8_char_basic (search );
219246 }
247+ #endif /* HAVE_SIMD */
220248}
221249
222250static inline void escape_UTF8_char (search_state * search , unsigned char ch_len )
@@ -2181,22 +2209,5 @@ void Init_generator(void)
21812209
21822210 rb_require ("json/ext/generator/state" );
21832211
2184-
2185- switch (find_simd_implementation ()) {
2186- #ifdef HAVE_SIMD
2187- #ifdef HAVE_SIMD_NEON
2188- case SIMD_NEON :
2189- search_escape_basic_impl = search_escape_basic_neon ;
2190- break ;
2191- #endif /* HAVE_SIMD_NEON */
2192- #ifdef HAVE_SIMD_SSE2
2193- case SIMD_SSE2 :
2194- search_escape_basic_impl = search_escape_basic_sse2 ;
2195- break ;
2196- #endif /* HAVE_SIMD_SSE2 */
2197- #endif /* HAVE_SIMD */
2198- default :
2199- search_escape_basic_impl = search_escape_basic ;
2200- break ;
2201- }
2212+ simd_impl = find_simd_implementation ();
22022213}
0 commit comments