30
30
#include "zend_property_hooks.h"
31
31
#include "zend_lazy_objects.h"
32
32
33
- #include <nmmintrin.h>
34
- # pragma GCC push_options
35
- # pragma GCC target ("sse4.2")
33
+ #ifdef ZEND_INTRIN_SSE4_2_NATIVE
34
+ # include <nmmintrin.h>
35
+ #endif
36
36
37
37
static const char digits [] = "0123456789abcdef" ;
38
38
@@ -432,8 +432,7 @@ static zend_always_inline bool php_json_printable_ascii_escape(smart_str *buf, u
432
432
return true;
433
433
}
434
434
435
- #ifdef __SSE2__
436
- // TODO: may be unused
435
+ #ifdef ZEND_INTRIN_SSE4_2_NATIVE
437
436
static zend_always_inline __m128i php_json_create_sse_escape_mask (int options )
438
437
{
439
438
const char sentinel = 1 ; /* outside of the printable range, so no false matches are possible */
@@ -483,9 +482,8 @@ zend_result php_json_escape_string(
483
482
484
483
pos = 0 ;
485
484
486
- #ifdef __SSE2__
485
+ #ifdef ZEND_INTRIN_SSE4_2_NATIVE
487
486
const __m128i sse_escape_mask = php_json_create_sse_escape_mask (options );
488
- (void ) sse_escape_mask ;
489
487
#endif
490
488
491
489
do {
@@ -505,7 +503,10 @@ zend_result php_json_escape_string(
505
503
max_shift = __builtin_ctz (input_range_mask );
506
504
}
507
505
508
- #if 0
506
+ #ifdef ZEND_INTRIN_SSE4_2_NATIVE /* TODO: resolver support */
507
+ const __m128i result_individual_bytes = _mm_cmpistrm (sse_escape_mask , input , _SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK );
508
+ int mask = _mm_cvtsi128_si32 (result_individual_bytes );
509
+ #else
509
510
const __m128i result_34 = _mm_cmpeq_epi8 (input , _mm_set1_epi8 ('"' ));
510
511
const __m128i result_38 = _mm_cmpeq_epi8 (input , _mm_set1_epi8 ('&' ));
511
512
const __m128i result_39 = _mm_cmpeq_epi8 (input , _mm_set1_epi8 ('\'' ));
@@ -523,9 +524,6 @@ zend_result php_json_escape_string(
523
524
524
525
const __m128i result_individual_bytes = _mm_or_si128 (result_34_38_39_47 , result_60_62_92 );
525
526
int mask = _mm_movemask_epi8 (result_individual_bytes );
526
- #else
527
- const __m128i result_individual_bytes = _mm_cmpistrm (sse_escape_mask , input , _SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK );
528
- int mask = _mm_cvtsi128_si32 (result_individual_bytes );
529
527
#endif
530
528
if (mask != 0 ) {
531
529
if (max_shift < 16 ) {
0 commit comments