Skip to content

Commit 24ad90d

Browse files
samyronmatzbot
authored andcommitted
[ruby/json] use a conditional to select SIMD implementation rather than pointer
ruby/json@86a5cce405
1 parent 875dce2 commit 24ad90d

File tree

1 file changed

+32
-21
lines changed

1 file changed

+32
-21
lines changed

ext/json/generator/generator.c

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ struct generate_json_data {
6363
long depth;
6464
};
6565

66+
static SIMD_Implementation simd_impl;
67+
6668
static VALUE cState_from_state_s(VALUE self, VALUE opts);
6769
static VALUE cState_partial_generate(VALUE self, VALUE obj, generator_func, VALUE io);
6870
static 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-
160160
static 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+
215225
static 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

222250
static 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

Comments
 (0)